Takket være funktionstypeopløsning vi kan også sende date
værdier til generate_series()
fordi der er en implicit cast fra date
til timestamp
samt fra date
til timestamptz
. Ville være tvetydigt, men timestamptz
er "foretrukket" blandt "Dato/tidstyper". Detaljeret forklaring:
- Generering af tidsserier mellem to datoer i PostgreSQL
For en bar date
den lokale tid 00:00
antages i rollebesætningen. Vær opmærksom på, at den aktuelle tidszoneindstilling direkte påvirker resultatet, hvis du bruger date
som input, da '2014-01-10 00:00' naturligvis repræsenterer et andet tidspunkt i Tokio, end det gør i New York.
Hvordan beslutter Postgres, hvilke typer der er acceptable?
Postgres skelner grundlæggende mellem tre typer afstøbninger:
Explicit casts
.. når du bruger CAST
eller ::
syntaks.Assignment cast
.. implicit cast, når en værdi er tildelt en målkolonne.Implicit cast
.. implicitte afstøbninger i alle andre udtryk.
Der skal være en implicit cast registreret i systemet fra inputtypen til den forventede type for at få en funktion til lydløst at acceptere (og konvertere) en inputværdi.
For at se, hvilke casts der er defineret til timestamptz
, kan du forespørge i 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
Alle disse medvirkende er implicitte . Per dokumentation på castcontext
:
Angiver hvilke sammenhænge castet kan påkaldes i. e
betyder kun som en eksplicit cast (ved hjælp af CAST
eller ::
syntaks). a
betyder implicit tildeling til en målkolonne, såvel som eksplicit. i
betyder implicit i udtryk, såvel som de andre tilfælde.
Fed fremhævelse mine.