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

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

Смелый акцент мой.