Функции форматирования дат
Функции strftime и strptime могут использоваться для преобразования значений DATE / TIMESTAMP в строки и обратно. Это часто требуется при парсинге CSV-файлов, отображении результатов пользователю или передаче информации между программами. Поскольку существует множество возможных представлений дат, эти функции принимают строку формата, описывающую структуру даты или временной метки.
strftime Примеры
Функция strftime(timestamp, format) преобразует временные метки или даты в строки в соответствии с заданным шаблоном.
SELECT strftime(DATE '1992-03-02', '%d/%m/%Y');
02/03/1992
SELECT strftime(TIMESTAMP '1992-03-02 20:32:45', '%A, %-d %B %Y - %I:%M:%S %p');
Monday, 2 March 1992 - 08:32:45 PM
strptime Примеры
Функция strptime(text, format) преобразует строки во временные метки в соответствии с заданным шаблоном.
SELECT strptime('02/03/1992', '%d/%m/%Y'); 1992-03-02 00:00:00
SELECT strptime('Monday, 2 March 1992 - 08:32:45 PM', '%A, %-d %B %Y - %I:%M:%S %p'); 1992-03-02 20:32:45
Функция strptime выдает ошибку при неудачном преобразовании:
SELECT strptime('02/50/1992', '%d/%m/%Y') AS x; Invalid Input Error: Could not parse string "02/50/1992" according to format specifier "%d/%m/%Y" 02/50/1992 ^ Error: Month out of range, expected a value between 1 and 12
Чтобы вернуть NULL при неудаче, используйте функцию try_strptime:
NULL
Парсинг CSV
Форматы дат также можно указать при парсинге CSV, как в операторе COPY, так и в функции read_csv. Это можно сделать, указав DATEFORMAT или TIMESTAMPFORMAT (или оба). DATEFORMAT будет использоваться для преобразования дат, а TIMESTAMPFORMAT — для преобразования временных меток. Ниже приведены примеры использования.
В операторе COPY:
COPY dates FROM 'test.csv' (DATEFORMAT '%d/%m/%Y', TIMESTAMPFORMAT '%A, %-d %B %Y - %I:%M:%S %p');
В функции read_csv:
SELECT *
FROM read_csv('test.csv', dateformat = '%m/%d/%Y'); Спецификаторы формата
Ниже приведен полный список всех доступных спецификаторов формата.
| Specifier | Описание | Пример |
|---|---|---|
%a | Сокращенное название дня недели. | Вс, Пн, … |
%A | Полное название дня недели. | Воскресенье, Понедельник, … |
%b | Сокращенное название месяца. | Янв, Фев, …, Дек |
%B | Полное название месяца. | Январь, Февраль, … |
%c | Представление даты и времени в формате ISO. | 1992-03-02 10:30:20 |
%d | Число месяца с нулевым заполнением. | 01, 02, …, 31 |
%-d | Число месяца в виде десятичной записи. | 1, 2, …, 30 |
%f | Микросекунды как десятичное число, дополненное нулями слева. | 000000 - 999999 |
%g | Миллисекунды как десятичное число, дополненное нулями слева. | 000 - 999 |
%G | Год по ISO 8601 с веком, представляющий год, содержащий большую часть ISO недели (см. %V). | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Час (24-часовой формат) в виде десятичного числа с нулевым заполнением. | 00, 01, …, 23 |
%-H | Час (24-часовой формат) в виде десятичного числа. | 0, 1, …, 23 |
%I | Час (12-часовой формат) в виде десятичного числа с нулевым заполнением. | 01, 02, …, 12 |
%-I | Час (12-часовой формат) в виде десятичного числа. | 1, 2, … 12 |
%j | День года в виде десятичного числа с нулевым заполнением. | 001, 002, …, 366 |
%-j | День года в виде десятичного числа. | 1, 2, …, 366 |
%m | Месяц в виде десятичного числа с нулевым заполнением. | 01, 02, …, 12 |
%-m | Месяц в виде десятичного числа. | 1, 2, …, 12 |
%M | Минута в виде десятичного числа с нулевым заполнением. | 00, 01, …, 59 |
%-M | Минута в виде десятичного числа. | 0, 1, …, 59 |
%n | Наносекунды как десятичное число, дополненное нулями слева. | 000000000 - 999999999 |
%p | AM или PM для текущего региона. | AM, PM |
%S | Секунда в виде десятичного числа с нулевым заполнением. | 00, 01, …, 59 |
%-S | Секунда в виде десятичного числа. | 0, 1, …, 59 |
%u | День недели по ISO 8601 в виде десятичного числа, где 1 — понедельник. | 1, 2, …, 7 |
%U | Номер недели в году. Неделя 01 начинается с первого воскресенья года, поэтому может быть неделя 00. Обратите внимание, что это не соответствует стандарту даты недели в ISO-8601. | 00, 01, …, 53 |
%V | Неделя по ISO 8601 как десятичное число, где понедельник — первый день недели. Неделя 01 — неделя, содержащая 4 января. | 01, …, 53 |
%w | День недели в виде десятичного числа. | 0, 1, …, 6 |
%W | Номер недели в году. Неделя 01 начинается с первого понедельника года, поэтому может быть неделя 00. Обратите внимание, что это не соответствует стандарту даты недели ISO-8601. | 00, 01, …, 53 |
%x | Представление даты в формате ISO | 1992-03-02 |
%X | Представление времени в формате ISO | 10:30:20 |
%y | Год без столетия в виде десятичной цифры с ведущими нулями. | 00, 01, …, 99 |
%-y | Год без столетия в виде десятичной цифры. | 0, 1, …, 99 |
%Y | Год со столетием в виде десятичной цифры. | 2013, 2019 и т.д. |
%z | Смещение времени от UTC в формате ±ЧЧ:ММ, ±ЧЧММ или ±ЧЧ. | -0700 |
%Z | Имя часового пояса. | Europe/Amsterdam |
%% | Буквальный символ %. | % |
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/functions/dateformat.html