Благодарение на разделителна способност на типа функция можем също да предадем date стойности към generate_series() защото има неявно прехвърляне от date до timestamp както и от date до timestamptz . Би било двусмислено, но timestamptz е „предпочитан“ сред „Типове дата/час“. Подробно обяснение:
- Генериране на времеви серии между две дати в PostgreSQL
За гола date местното време 00:00 се предполага в актьорския състав. Имайте предвид, че текущата настройка на часовата зона пряко влияе върху резултата, ако използвате date като вход, тъй като очевидно „2014-01-10 00:00“ представлява различен момент във времето в Токио, отколкото в Ню Йорк.
Как Postgres решава кои типове са приемливи?
Postgres основно разграничава три типа cast:
Explicit casts .. когато използвате CAST или :: синтаксис.Assignment cast .. неявно прехвърляне, когато стойност е присвоена на целева колона.Implicit cast .. неявни прехвърляния във всички други изрази.
Трябва да има неявно прехвърляне, регистрирано в системата от входния тип към очаквания тип, за да накара функцията да приеме (и преобразува) безшумно входна стойност.
За да видите кои прехвърляния са дефинирани към timestamptz , можете да потърсите каталожната таблица pg_cast :
SELECT castsource::regtype, casttarget::regtype, castcontext
FROM pg_cast
WHERE casttarget = 'timestamptz'::regtype;
castsource | casttarget | castcontext
-----------------------------+--------------------------+-------------
abstime | timestamp with time zone | i
date | timestamp with time zone | i
timestamp without time zone | timestamp with time zone | i
timestamp with time zone | timestamp with time zone | i
Всички тези прехвърляния са имплицитни . Според документация за castcontext :
Показва в какви контексти може да бъде извикано прехвърлянето.
eозначава само като неявно предаване (използвайкиCASTили::синтаксис).aозначава имплицитно присвояване на целева колона, както и изрично.iозначава имплицитно в изразите, както и останалите случаи.
Удебелен акцент мой.