Благодарение на разделителна способност на типа функция можем също да предадем 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
означава имплицитно в изразите, както и останалите случаи.
Удебелен акцент мой.