Создать серию дат - используя тип даты в качестве входных данных
Документация для generate_series
говорит, что аргумент может быть int
или же bigint
за generate_series(start, stop)
а также generate_series(start, stop, step)
случаи и timestamp
или же timestamp with time zone
за generate_series(start, stop, step interval)
,
В чем причина того, что generate_series
работает также с date
введите в качестве ввода и возвращает timestamp with timezone
?
pg=# select generate_series('2014-01-01'::date,'2014-01-02'::date,'1 day');
generate_series
------------------------
2014-01-01 00:00:00+01
2014-01-02 00:00:00+01
(2 rows)
1 ответ
Благодаря разрешению типа функции мы также можем передать date
значения для generate_series()
потому что есть неявное приведение date
в timestamp
а также из date
в timestamptz
, Было бы неоднозначно, но timestamptz
является "предпочтительным" среди "типов даты / времени". Детальное объяснение:
Для голых date
местное время 00:00
предполагается в актерском составе. Имейте в виду, что текущая настройка часового пояса напрямую влияет на результат, если вы используете date
В качестве входных данных, очевидно, "2014-01-10 00:00" представляет собой другой момент времени в Токио, чем в Нью-Йорке.
Как Postgres решает, какие типы являются приемлемыми?
Postgres в основном различает три типа приведений:
Explicit casts
.. когда используешь CAST
или же ::
синтаксис. Assignment cast
.. неявное приведение, когда значение назначено целевому столбцу. Implicit cast
.. неявное приведение во всех других выражениях.
Должно быть неявное приведение, зарегистрированное в системе от входного типа к ожидаемому типу, чтобы функция молча принимала (и преобразовывала) входное значение.
Чтобы увидеть, какие броски определены для timestamptz
Вы можете запросить таблицу каталога 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
Все эти приведения являются неявными. По документации на castcontext
:
Указывает, в каких контекстах может быть задействован актерский состав.
e
означает только как явное приведение (используяCAST
или же::
синтаксис).a
означает неявно при присваивании целевому столбцу, а также явно.i
означает неявно в выражениях, а также в других случаях.
Жирный акцент мой.