Функции даты и времени — схема миграции SQL Server на Aurora PostgreSQL
Функции даты и времени — схема миграции SQL Server на Aurora PostgreSQLSQL Server UsagePostgreSQL UsageSummary
Совместимость функций | Уровень автоматизации AWS SCT / AWS DMS | Код действия AWS SCT, индекс | Ключевые отличия |
---|---|---|---|
Типы данных | PostgreSQL использует другие имена функций. |
Использование SQL Server
Функции даты и времени — это скалярные функции, которые выполняют операции с временными или числовыми входными данными и возвращают временные или числовые значения.
Системные значения даты и времени получены из операционной системы сервера, на котором работает SQL Server.
В этом разделе не рассматриваются особенности часового пояса и функции, учитывающие часовой пояс. Дополнительные сведения об обработке часовых поясов см. в разделе Типы данных.
Синтаксис и примеры
В следующей таблице приведены наиболее часто используемые функции даты и времени.
Функция | Назначение | Пример | Результат | Комментарии |
---|---|---|---|---|
| Возвращает значение даты и времени, содержащее текущую местную дату или время в формате UTC. | | 2018-04-05 15:53:01.380 | |
| Возвращает целочисленное значение, представляющее указанную | | 4, 2018 | |
| Возвращает целочисленное значение | | 25 | Сколько дней осталось до конца месяца. |
| Возвращает значение даты и времени, рассчитанное с интервалом смещения до указанной | | 2018-04-30 15:55:52. 147 | |
| Преобразует значения даты и времени в строковые литералы и обратно, а также в другие форматы даты и времени. | ВЫБЕРИТЕ ПРЕОБРАЗОВАТЬ (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 | Определение функции |
---|---|
| Вычесть из |
| Текущие дата и время. |
| Текущая дата. |
| Текущее время суток. |
| Текущая дата и время (начало текущей транзакции). |
| Получение подполя (эквивалентно извлечению). |
| Обрезать до указанной точности. |
| Получить подполе. |
| Проверка конечного интервала. |
| Отрегулируйте интервал таким образом, чтобы 30-дневные периоды времени представлялись в виде месяцев. |
| Отрегулируйте интервал таким образом, чтобы 24-часовые периоды времени представлялись в виде дней. |
| Настройка интервала с помощью |
| Текущее время суток. |
| Создать дату из полей года, месяца и дня. |
| Создать интервал из полей лет, месяцев, недель, дней, часов, минут и секунд. |
| Создать время из полей часов, минут и секунд. |
| Создать метку времени из полей года, месяца, дня, часа, минуты и секунды. |
| Создать метку времени с часовым поясом из полей года, месяца, дня, часа, минуты и секунды. Если часовой пояс не указан, используется текущий часовой пояс. |
СЕЙЧАС | Текущие дата и время. |
| Текущие дата и время. |
| Текущие дата и время (аналогично clock_timestamp, но в виде текстовой строки). |
| Текущие дата и время. |
| Преобразовать эпоху Unix (секунды с 1970-01-01 00:00:00+00) в метку времени. |
Сводка
Функция SQL Server | Функция Aurora PostgreSQL |
---|---|
| |
| |
| |
| |
| |
| |
| |
Дополнительные сведения см. в разделе Функции и операторы даты/времени в документации PostgreSQL .
Javascript отключен или недоступен в вашем браузере.
Чтобы использовать документацию Amazon Web Services, должен быть включен Javascript. Инструкции см. на страницах справки вашего браузера.
Условные обозначения документов
Курсоры
Строковые функции
Как обрабатывать разницу в дате и времени в PostgreSQL | Мари Лефевр
SQL TIPS
3 приема, которые сделают вашу жизнь проще, когда функция DATE_DIFF() недоступна
Опубликовано в·
5 мин чтения 2022 Фото Джона Тайсона на UnsplashProspect 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 .