Note
由于目前没有TIMESTAMP_NS WITH TIME ZONE
数据类型,具有纳秒精度和“即时语义”的外部列,例如具有isAdjustedToUTC=true
的parquet时间戳列,在使用DuckDB读取时会丢失精度。
时间戳表示绝对时间中的点,通常称为瞬间。
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
支持三个额外的小数位)。超出目标亚秒精度的小数位将被忽略。
Note
由于目前没有
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 | 无穷大 |
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 扩展时,才需要执行 INSTALL
和 LOAD
步骤。
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';
名称 | 值 | 描述 | 输入类型 |
---|---|---|---|
日历 | gregorian | 当前日历 | VARCHAR |