Типы временных меток
Временные метки представляют моменты абсолютного времени, обычно называемые мгновениями. DuckDB представляет мгновения как количество микросекунд (мкс) с момента 1970-01-01 00:00:00+00.
Типы временных меток
| Имя | Псевдонимы | Описание |
|---|---|---|
TIMESTAMP_NS | временная метка с точностью до наносекунд (игнорирует часовой пояс) | |
TIMESTAMP | DATETIME | временная метка с точностью до микросекунд (игнорирует часовой пояс) |
TIMESTAMP_MS | временная метка с точностью до миллисекунд (игнорирует часовой пояс) | |
TIMESTAMP_S | временная метка с точностью до секунды (игнорирует часовой пояс) | |
TIMESTAMPTZ | TIMESTAMP WITH TIME ZONE | временная метка (использует часовой пояс) |
Временная метка определяет комбинацию DATE (год, месяц, день) и TIME (час, минута, секунда, микросекунда). Временные метки можно создавать с использованием ключевого слова TIMESTAMP, где данные должны быть отформатированы в соответствии с форматом ISO 8601 (YYYY-MM-DD hh:mm:ss[.zzzzzz][+-TT[:tt]]). Десятичные знаки, выходящие за рамки заданной точности долей секунды, игнорируются.
Предупреждение. При определении временных меток с помощью литерала
TIMESTAMP_NS, десятичные знаки, выходящие за рамки микросекунд, игнорируются. Обратите внимание, что типTIMESTAMP_NSможет хранить наносекунды при создании, например, при загрузке файлов Parquet.
SELECT TIMESTAMP_NS '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456
SELECT TIMESTAMP '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456
SELECT DATETIME '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456
SELECT TIMESTAMP_MS '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123
SELECT TIMESTAMP_S '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00
SELECT TIMESTAMPTZ '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456+00
SELECT TIMESTAMP WITH TIME ZONE '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456+00
Специальные значения
Также существуют три специальных значения дат, которые можно использовать на входе:
| Строка ввода | Допустимые типы | Описание |
|---|---|---|
epoch |
TIMESTAMP, TIMESTAMPTZ
| 1970-01-01 00:00:00+00 (нулевое время системы Unix) |
infinity |
TIMESTAMP, TIMESTAMPTZ
| позже всех других временных меток |
-infinity |
TIMESTAMP, TIMESTAMPTZ
| раньше всех других временных меток |
Значения infinity и -infinity специально представлены внутри системы и будут отображаться без изменений; но epoch — просто сокращение для записи, которое будет преобразовано в значение временной метки при чтении.
SELECT '-infinity'::TIMESTAMP, 'epoch'::TIMESTAMP, 'infinity'::TIMESTAMP;
| Отрицательное | Эпоха | Положительное |
|---|---|---|
| -бесконечность | 1970-01-01 00:00:00 | бесконечность |
Функции
Часовые пояса
Тип TIMESTAMPTZ может быть разбит на календарные и часовые интервалы с помощью соответствующего расширения. Встроенное расширение ICU реализует все функции разбиения и арифметики, используя функции часовых поясов и календарей International Components for Unicode.
Для установки используемого часового пояса сначала загрузите расширение ICU. Расширение ICU поставляется в комплекте с несколькими клиентами DuckDB (включая Python, R, JDBC и ODBC), поэтому этот шаг можно пропустить в этих случаях. В других случаях вам может потребоваться сначала установить и загрузить расширение ICU.
INSTALL icu; LOAD icu;
Далее, используйте команду SET TimeZone.
SET TimeZone = 'America/Los_Angeles';
Операции разбиения по времени для TIMESTAMPTZ будут реализованы с использованием указанного часового пояса.
Список доступных часовых поясов можно получить из табличной функции pg_timezone_names():
SELECT
name,
abbrev,
utc_offset
FROM pg_timezone_names()
ORDER BY
name; Вы также можете найти справочную таблицу доступных часовых поясов.
Календари
Расширение ICU также поддерживает календари, отличные от григорианского, с помощью команды SET Calendar. Обратите внимание, что шаги INSTALL и LOAD необходимы только в том случае, если клиент DuckDB не включает расширение ICU.
INSTALL icu; LOAD icu; SET Calendar = 'japanese';
Операции разбиения по времени для TIMESTAMPTZ будут затем реализованы с использованием заданного календаря. В этом примере часть era теперь будет отображать номер японской императорской эры.
Список доступных календарей можно получить из табличной функции icu_calendar_names():
SELECT name FROM icu_calendar_names() ORDER BY 1;
Настройки
Текущее значение настроек TimeZone и Calendar определяется ICU при запуске. Их можно запросить в табличной функции duckdb_settings():
SELECT * FROM duckdb_settings() WHERE name = 'TimeZone';
| Имя | Значение | Описание | Тип ввода |
|---|---|---|---|
| Часовой пояс | Europe/Amsterdam | Текущий часовой пояс | VARCHAR |
SELECT * FROM duckdb_settings() WHERE name = 'Calendar';
| Имя | Значение | Описание | Тип ввода |
|---|---|---|---|
| Календарь | григорианский | Текущий календарь | VARCHAR |
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/data_types/timestamp.html