Tack vare upplösning av funktionstyp vi kan också skicka date
värden till generate_series()
eftersom det finns en implicit cast från date
till timestamp
samt från date
till timestamptz
. Skulle vara tvetydigt, men timestamptz
är "föredragen" bland "Datum/tidstyper". Detaljerad förklaring:
- Genererar tidsserier mellan två datum i PostgreSQL
För ett blott date
den lokala tiden 00:00
antas i rollistan. Var medveten om att den aktuella tidszonsinställningen direkt påverkar resultatet om du använder date
som input eftersom "2014-01-10 00:00" uppenbarligen representerar en annan tidpunkt i Tokio än den gör i New York.
Hur avgör Postgres vilka typer som är acceptabla?
Postgres skiljer i princip mellan tre typer av kast:
Explicit casts
.. när du använder CAST
eller ::
syntax.Assignment cast
.. implicit cast när ett värde tilldelas en målkolumn.Implicit cast
.. implicita gjutningar i alla andra uttryck.
Det måste finnas en implicit cast registreras i systemet från ingångstyp till förväntad typ för att få en funktion att tyst acceptera (och konvertera) ett indatavärde.
För att se vilka casts som är definierade till timestamptz
, kan du fråga katalogtabellen 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
Alla dessa rollbesättningar är implicita . Per dokumentation på castcontext
:
Indikerar vilka sammanhang skådespelaren kan anropas i.
e
betyder endast som en explicit cast (medCAST
eller::
syntax).a
betyder implicit tilldelning till en målkolumn, såväl som explicit.i
betyder underförstått i uttryck, såväl som de andra fallen.
Djärv betoning min.