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

Документация для generate_series говорит, что аргумент может быть int или bigint для 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) 

Благодаря разрешению типа функции мы также можем передавать значения date в generate_series() потому что есть неявный откат от date до timestamp а также от date до timestamptz . Было бы двусмысленно, но timestamptz «предпочтительнее» среди «Тип даты / времени». Детальное объяснение:

  • Создание временных рядов между двумя датами в PostgreSQL

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

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

  • Использование IsAssignableFrom с открытыми типами
  • Есть ли способ отключить перегрузку функций в Postgres
  • Строка не была признана действительным DateTime "format dd / MM / yyyy"
  • Как проверить, наследует ли class другой class, не создавая его?
  • Интерфейсы Java и типы возврата
  • Почему streamи C ++ используют char вместо unsigned char?
  • Преобразовать строку в тип C #
  • Типы данных PostgreSQL и C #
  • Тестирование, если объект имеет общий тип в C #
  • Определить тип файла изображения
  • Разница между типами string и char в C ++
  • Давайте будем гением компьютера.