Sql

Date postgresql functions: PostgreSQL: Documentation: 15: 9.9. Date/Time Functions and Operators

Функции даты и времени — схема миграции SQL Server на Aurora PostgreSQL

Функции даты и времени — схема миграции SQL Server на Aurora PostgreSQL

SQL Server UsagePostgreSQL UsageSummary

Совместимость функций Уровень автоматизации AWS SCT / AWS DMS Код действия AWS SCT, индекс Ключевые отличия

Типы данных

PostgreSQL использует другие имена функций.

Использование SQL Server

Функции даты и времени — это скалярные функции, которые выполняют операции с временными или числовыми входными данными и возвращают временные или числовые значения.

Системные значения даты и времени получены из операционной системы сервера, на котором работает SQL Server.

В этом разделе не рассматриваются особенности часового пояса и функции, учитывающие часовой пояс. Дополнительные сведения об обработке часовых поясов см. в разделе Типы данных.

Синтаксис и примеры

В следующей таблице приведены наиболее часто используемые функции даты и времени.

Функция Назначение Пример Результат Комментарии

ПОЛУЧИТЬ ДАТУ и ПОЛУЧИТЬ ДАТУ

Возвращает значение даты и времени, содержащее текущую местную дату или время в формате UTC.

ВЫБЕРИТЕ ПОЛУЧИТЬДАТУ()

2018-04-05 15:53:01.380

DATEPART , ДЕНЬ , МЕСЯЦ и ГОД

Возвращает целочисленное значение, представляющее указанную DATEPART указанную дату.

ВЫБЕРИТЕ МЕСЯЦ(GETDATE()), ГОД(GETDATE())

4, 2018

РАЗНИЦА ДАТЫ

Возвращает целочисленное значение DATEPART границ, которые пересекаются между двумя датами.

ВЫБЕРИТЕ РАЗНИЦУ ДАТЫ(ДЕНЬ, ПОЛУЧИТЬДАТУ(), КОНМЕСЯЦ(ПОЛУЧИТЬДАТУ()))

25

Сколько дней осталось до конца месяца.

ДАТАДОБАВИТЬ

Возвращает значение даты и времени, рассчитанное с интервалом смещения до указанной DATEPART даты.

ВЫБЕРИТЕ ДАТУДОБАВИТЬ(ДЕНЬ, 25, ПОЛУЧИТЬДАТУ())

2018-04-30 15:55:52. 147

ПРЕВРАТИТЬ и ПРЕОБРАЗОВАТЬ

Преобразует значения даты и времени в строковые литералы и обратно, а также в другие форматы даты и времени.

SELECT CAST (ПОЛУЧИТЬ ДАТУ () КАК ДАТУ)

ВЫБЕРИТЕ ПРЕОБРАЗОВАТЬ (VARCHAR(20), GETDATE(), 112)

05.04.2018 20180405

Формат даты по умолчанию. Стиль 112 (ISO) без разделителей.

Дополнительные сведения см. в разделе Функции даты и времени в документации SQL Server .

Использование PostgreSQL

Amazon Aurora PostgreSQL-Compatible Edition (Aurora PostgreSQL) предоставляет очень богатый набор скалярных функций даты и времени; больше, чем SQL Server.

Хотя некоторые функции похожи на функции SQL Server, их функциональность существенно отличается. Будьте особенно осторожны при переносе темпоральной логики на парадигмы Aurora PostgreSQL.

Функции и определение

Функция PostgreSQL Определение функции

ВОЗРАСТ

Вычесть из current_date .

ЧАСЫ_TIMESTAMP

Текущие дата и время.

ТЕКУЩАЯ_ДАТА

Текущая дата.

ТЕКУЩЕЕ_ВРЕМЯ

Текущее время суток.

CURRENT_TIMESTAMP

Текущая дата и время (начало текущей транзакции).

ДАТА_ЧАСТЬ

Получение подполя (эквивалентно извлечению).

DATE_TRUNC

Обрезать до указанной точности.

ЭКСТРАКТ

Получить подполе.

ИСФИНИТ

Проверка конечного интервала.

JUSTIFY_DAYS

Отрегулируйте интервал таким образом, чтобы 30-дневные периоды времени представлялись в виде месяцев.

JUSTIFY_HOURS

Отрегулируйте интервал таким образом, чтобы 24-часовые периоды времени представлялись в виде дней.

JUSTIFY_INTERVAL

Настройка интервала с помощью justify_days и justify_hours с дополнительными корректировками знака.

МЕСТНОЕ ВРЕМЯ

Текущее время суток.

MAKE_DATE

Создать дату из полей года, месяца и дня.

СДЕЛАТЬ_ИНТЕРВАЛ

Создать интервал из полей лет, месяцев, недель, дней, часов, минут и секунд.

СДЕЛАТЬ_ВРЕМЯ

Создать время из полей часов, минут и секунд.

MAKE_TIMESTAMP

Создать метку времени из полей года, месяца, дня, часа, минуты и секунды.

MAKE_TIMESTAMPTZ

Создать метку времени с часовым поясом из полей года, месяца, дня, часа, минуты и секунды. Если часовой пояс не указан, используется текущий часовой пояс.

СЕЙЧАС

Текущие дата и время.

STATEMENT_TIMESTAMP

Текущие дата и время.

ВРЕМЯ ДНЯ

Текущие дата и время (аналогично clock_timestamp, но в виде текстовой строки).

TRANSACTION_TIMESTAMP

Текущие дата и время.

TO_TIMESTAMP

Преобразовать эпоху Unix (секунды с 1970-01-01 00:00:00+00) в метку времени.

Сводка

Функция SQL Server Функция Aurora PostgreSQL

GETDATE , CURRENT_TIMESTAMP

СЕЙЧАС , CURRENT_DATE , CURRENT_TIME , CURRENT_TIMESTAMP

ПОЛУЧИТЬ ДАТУ

current_timestamp в часовом поясе 'UTC'

ДЕНЬ , МЕСЯЦ и ГОД

ВЫДЕРЖКА (ДЕНЬ/МЕСЯЦ/ГОД ИЗ TIMESTAMP timestamp_value)

ДАТАЧАСТЬ

ВЫДЕРЖКА , ДАТА_ЧАСТЬ

РАЗНИЦА ДАТЫ

ДАТА_ЧАСТЬ

ДАТАДОБАВИТЬ

+ ИНТЕРВАЛ 'X дней/месяцев/лет'

ПРЕВРАТИТЬ и ПРЕОБРАЗОВАТЬ

ЛИТОЕ

Дополнительные сведения см. в разделе Функции и операторы даты/времени в документации PostgreSQL .

Javascript отключен или недоступен в вашем браузере.

Чтобы использовать документацию Amazon Web Services, должен быть включен Javascript. Инструкции см. на страницах справки вашего браузера.

Условные обозначения документов

Курсоры

Строковые функции

Как обрабатывать разницу в дате и времени в PostgreSQL | Мари Лефевр

SQL TIPS

3 приема, которые сделают вашу жизнь проще, когда функция DATE_DIFF() недоступна

Опубликовано в

·

5 мин чтения 2022

Фото Джона Тайсона на Unsplash

Prospect A подписался на предложение услуг вашей компании 20 января 2022 года в 8:00. Она отменила подписку 3 февраля 2022 года в 16:00. Как давно она является клиентом вашей компании?

Чтобы ответить на этот вопрос, вам нужно будет вычислить разницу между двумя моментами времени. Независимо от того, какая временная шкала наиболее уместна в данной конкретной ситуации (должна ли разница быть выражена в неделях? в днях? в часах?), должна существовать функция, которая поможет вам легко определить, сколько времени прошло между двумя событиями — в данном случае , между регистрацией потенциального клиента и отменой ее подписки.

В моем предыдущем опыте работы я получал ответы на вопросы такого типа с помощью консоли Google BigQuery, которая была напрямую подключена к нашей базе данных. В Google BigQuery запросы пишутся на стандартном SQL. Достаточно удобно, что существует простая в реализации формула для вычисления разницы между двумя моментами времени : DATE_DIFF().

Однако в PostgreSQL не имеет прямого эквивалента DATE_DIFF() . Поэтому мы должны найти правильную комбинацию существующих функций, чтобы получить на выходе то, что нам действительно нужно. На эту тему документация PostgreSQL обширна, но я должен признать, что я как-то запутался со всеми перечисленными формулами.

Выдержка из документации PostgreSQL

То, что казалось простым, оказалось немного сложнее, чем я ожидал, поэтому я подумал, что могу поделиться с вами 3 следующих совета для правильной обработки разницы дат в PostgreSQL .

Давайте рассмотрим их подробнее на примере, упомянутом во введении. В этом примере предположим, что мы определяем две входные переменные : start_date и end_date. То, что мы хотим получить в виде вывода, — это разница между этими двумя датами и временем :

  • в днях
  • в часах
Пример автора

Первый совет, который я использовал, взят из SQLines:

Извлечение из SQLines

Они предлагают создать пользовательскую функцию или, если у вас есть права или навыки только для написания декларативного SQL ( SELECT... ), предлагаемое решение — использовать последовательность DATE_PART( ) функции. В нашем примере, чтобы получить разницу в днях и часах, мы бы написали следующее:

Это привело бы к следующему выводу:

Вывод подсказки №1 — Код и скриншот автора

Расчет правильный, и вывод легко интерпретируется. Однако я вижу два недостатка этого метода.

Во-первых, требуемый фрагмент кода не является компактным . Для лучшей удобочитаемости кода необходимо убедиться, что код имеет правильный отступ, чтобы читатель понял, какой «DATEPART» соответствует какой части вычисления. В нашем примере мы дошли только до часовой шкалы, но если бы мы хотели вычислить разницу в секундах, мы бы добавили еще две функции DATE_PART.

Во-вторых, несколько раз вызов функции DATE_PART() приводит к возможна потеря производительности при выполнении фрагмента кода . При реализации различных параметров для одних и тех же выходных данных вы должны обязательно сравнивать производительность двух запросов применительно к одному и тому же набору данных.

В PostgreSQL функция AGE() даст развернутый ответ на ваш вопрос: сколько времени прошло между этими двумя событиями? Вывод представлен в виде текстовой строки , отображающей разницу между двумя моментами времени.

Вывод будет выглядеть так:

Результат совета № 2 — код и снимок экрана автора

В зависимости от ваших входных данных и варианта использования, который вы решаете, вы можете быть удовлетворены этим методом. В частности, если вы отвечаете потребностям конечного пользователя с помощью выходных данных, заданных функцией AGE(), может быть нет необходимости чрезмерно усложнять выходные данные .

Если вы уверены, что все ваши значения включены в заданную дату и временную шкалу, сделайте это проще. Просто придерживайтесь функции AGE() и комбинируйте ее с EXTRACT() 9.0638 . Это правильно работает для разницы, выраженной в днях ниже. Но внимательно посмотрите на вывод разницы в часах:

Вывод нецелевого использования подсказки №2 — Код и скриншот автора

Как вы могли заметить, проблема со вторым запросом в том, что мы пытаемся вернуть разницу между двумя днями в часах. Здесь функция AGE() не подходит: возвращает разницу в часах… независимо от дня!

В такой ситуации — и в любом случае, если у вас есть сомнения — лучше используйте комбинацию функции EXTRACT() и параметра EPOCH .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *