Dzięki rozdzielczości typu funkcji możemy również przekazać date
wartości do generate_series()
ponieważ istnieje ukryta rzutuj od date
do timestamp
jak również od date
do timestamp
. Byłoby niejednoznaczne, ale timestamptz
jest "preferowany" wśród „Typy daty/godziny”. Szczegółowe wyjaśnienie:
- Generowanie szeregów czasowych między dwiema datami w PostgreSQL
Dla czystej date
czas lokalny 00:00
zakłada się w obsadzie. Pamiętaj, że bieżące ustawienie strefy czasowej ma bezpośredni wpływ na wynik, jeśli użyjesz date
jako dane wejściowe, ponieważ oczywiście „2014-01-10 00:00” reprezentuje inny moment w Tokio niż w Nowym Jorku.
W jaki sposób Postgres decyduje, jakie typy są akceptowalne?
Postgres zasadniczo rozróżnia trzy typy rzutów:
Explicit casts
.. podczas korzystania z CAST
lub ::
składnia.Assignment cast
.. niejawne rzutowanie, gdy wartość jest przypisana do kolumny docelowej.Implicit cast
.. niejawne rzutowania we wszystkich innych wyrażeniach.
Musi być ukryta rzutowanie zarejestrowane w systemie z typu wejściowego na typ oczekiwany, aby funkcja po cichu zaakceptowała (i przekonwertowała) wartość wejściową.
Aby zobaczyć, które rzuty są zdefiniowane do timestamptz
, możesz wysłać zapytanie do tabeli 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
Wszystkie te obsady są ukryte . Zgodnie z dokumentacją dotyczącą castcontext
:
Wskazuje, w jakich kontekstach można wywoływać rzutowanie. e
oznacza tylko jako jawne rzutowanie (za pomocą CAST
lub ::
składnia). a
oznacza niejawnie przypisanie do kolumny docelowej, a także jawnie. i
oznacza domyślnie w wyrażeniach, jak również w innych przypadkach.
Pogrubiony nacisk na moje.