Создать серию дат - используя тип даты в качестве входных данных

Документация для 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 означает неявно в выражениях, а также в других случаях.

Жирный акцент мой.

Другие вопросы по тегам