Díky rozlišení typu funkce můžeme také předat date
hodnoty do generate_series()
protože existuje implicitní obsazení od date
na timestamp
stejně jako od date
na timestamptz
. Bylo by to nejednoznačné, ale timestamptz
je "preferováno" mezi "Typy data/času". Podrobné vysvětlení:
- Generování časových řad mezi dvěma daty v PostgreSQL
Pro holé date
místní čas 00:00
se předpokládá v obsazení. Uvědomte si, že aktuální nastavení časového pásma přímo ovlivňuje výsledek, pokud použijete date
jako vstup, protože '2014-01-10 00:00' samozřejmě představuje jiný časový okamžik v Tokiu než v New Yorku.
Jak Postgres rozhoduje, jaké typy jsou přijatelné?
Postgres v zásadě rozlišuje tři typy obsazení:
Explicit casts
.. při použití CAST
nebo ::
syntaxe.Assignment cast
.. implicitní přetypování, když je hodnota přiřazena k cílovému sloupci.Implicit cast
.. implicitní přetypování ve všech ostatních výrazech.
Musí existovat implicitní cast zaregistrovaná v systému z typu vstupu na očekávaný typ, aby funkce tiše přijala (a převedla) vstupní hodnotu.
Chcete-li zjistit, která obsazení jsou definována pro timestamptz
, můžete se dotazovat na tabulku katalogu 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
Všechna tato obsazení jsou implicitní . Podle dokumentace na castcontext
:
Označuje, v jakých kontextech lze přetypování vyvolat.
e
znamená pouze jako explicitní přetypování (pomocíCAST
nebo::
syntax).a
znamená implicitní přiřazení k cílovému sloupci i explicitně.i
znamená implicitně ve výrazech, stejně jako v ostatních případech.
Tučné zdůraznění moje.