Dank Funktionstypauflösung wir können auch date
übergeben Werte zu generate_series()
weil es ein implizites gibt Besetzung ab date
zu timestamp
sowie ab date
zu timestamptz
. Wäre mehrdeutig, aber timestamptz
ist "bevorzugt" unter "Datums-/Zeittypen". Ausführliche Erklärung:
- Generieren von Zeitreihen zwischen zwei Daten in PostgreSQL
Für ein bloßes date
Ortszeit 00:00
wird in der Besetzung angenommen. Beachten Sie, dass die aktuelle Zeitzoneneinstellung das Ergebnis direkt beeinflusst, wenn Sie date
verwenden als Eingabe, da '2014-01-10 00:00' in Tokio offensichtlich einen anderen Zeitpunkt darstellt als in New York.
Wie entscheidet Postgres, welche Typen akzeptabel sind?
Postgres unterscheidet grundsätzlich zwischen drei Arten von Casts:
Explicit casts
.. bei Verwendung von CAST
oder ::
Syntax.Assignment cast
.. implizite Umwandlung, wenn einer Zielspalte ein Wert zugewiesen wird.Implicit cast
.. implizite Casts in allen anderen Ausdrücken.
Es muss ein implizites geben im System registrierte Umwandlung vom Eingabetyp in den erwarteten Typ, damit eine Funktion stillschweigend einen Eingabewert akzeptiert (und umwandelt).
Um zu sehen, welche Casts für definiert sind timestamptz
können Sie die Katalogtabelle pg_cast
abfragen :
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 diese Umwandlungen sind implizit . Per Dokumentation zu castcontext
:
Gibt an, in welchen Kontexten die Umwandlung aufgerufen werden kann. e
bedeutet nur als expliziter Cast (mit CAST
oder ::
Syntax). a
bedeutet sowohl implizite Neuzuweisung zu einer Zielspalte als auch explizit. i
bedeutet implizit in Ausdrücken sowie in den anderen Fällen.
Fettdruck von mir.