⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Timestamp Types

时间戳表示绝对时间中的点,通常称为瞬间。 DuckDB将瞬间表示为自1970-01-01 00:00:00+00以来的微秒数(µs)(或对于TIMESTAMP_NS为纳秒)。

时间戳类型

Name Aliases Description
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 WITH TIME ZONE数据类型,具有纳秒精度和“即时语义”的外部列,例如具有isAdjustedToUTC=true的parquet时间戳列,在使用DuckDB读取时会丢失精度。

SELECT TIMESTAMP_NS '1992-09-20 11:30:00.123456789';
1992-09-20 11:30:00.123456789
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 无穷大

Functions

参见 Timestamp Functions.

时区

TIMESTAMPTZ 类型可以使用适当的扩展程序将其分箱到日历和时钟分箱中。 内置的 ICU 扩展 使用 国际 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 命令的非公历日历。 请注意,只有在 DuckDB 客户端未捆绑 ICU 扩展时,才需要执行 INSTALLLOAD 步骤。

INSTALL icu;
LOAD icu;
SET Calendar = 'japanese';

对于TIMESTAMPTZ的时间分箱操作将使用给定的日历实现。 在这个例子中,era部分现在将报告日本皇纪年号。

可以从icu_calendar_names()表函数中获取可用日历的列表:

SELECT name
FROM icu_calendar_names()
ORDER BY 1;

Settings

TimeZoneCalendar 设置的当前值由 ICU 启动时确定。 可以从 duckdb_settings() 表函数中查询它们:

SELECT *
FROM duckdb_settings()
WHERE name = 'TimeZone';
名称 描述 输入类型
时区 Europe/Amsterdam 当前时区 VARCHAR
SELECT *
FROM duckdb_settings()
WHERE name = 'Calendar';
名称 描述 输入类型
日历 gregorian 当前日历 VARCHAR