- 安装
- Documentation
- 入门指南
- 连接
- 数据导入
- Client APIs
- 概述
- C
- C++
- CLI
- Dart
- Go
- Java
- Julia
- Node.js (Neo)
- Node.js
- Python
- 概览
- 数据摄取
- DuckDB 和 Python 之间的转换
- DB API
- 关系型API
- Function API
- Types API
- Expression API
- Spark API
- API 参考
- 已知的Python问题
- R
- Rust
- Swift
- Wasm
- ADBC
- ODBC
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- 导出和导入数据库
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 解嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预编译语句
- 数据类型
- 概览
- Array
- Bitstring
- Blob
- 布尔
- 日期
- Enum
- Interval
- 列表
- 字面量类型
- 映射
- NULL值
- Numeric
- Struct
- 文本
- Time
- 时间戳
- 时区
- Union
- 类型转换
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- Struct 函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区的时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- Meta 查询
- DuckDB的SQL方言
- Samples
- 配置
- 扩展
- 概述
- 核心扩展
- 社区扩展
- 使用扩展
- 扩展的版本控制
- Arrow
- 自动完成
- AWS
- Azure
- Delta
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- Substrait
- TPC-DS
- TPC-H
- VSS
- 指南
- 概述
- 数据查看器
- 数据库集成
- 文件格式
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过HTTPS / S3使用DuckDB
- Meta 查询
- ODBC
- 性能
- Python
- 安装
- 执行SQL
- Jupyter Notebooks
- SQL on Pandas
- 从Pandas导入
- 导出到 Pandas
- 从Numpy导入
- 导出到Numpy
- SQL on Arrow
- 从Arrow导入
- 导出到 Arrow
- Pandas上的关系API
- 多线程 Python
- 与Ibis的集成
- 与 Polars 的集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- Sitemap
- Why DuckDB
- Media
- FAQ
- Code of Conduct
- Live Demo
时间戳表示绝对时间中的点,通常称为瞬间。
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
时区
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;
Settings
TimeZone
和 Calendar
设置的当前值由 ICU 启动时确定。
可以从 duckdb_settings()
表函数中查询它们:
SELECT *
FROM duckdb_settings()
WHERE name = 'TimeZone';
名称 | 值 | 描述 | 输入类型 |
---|---|---|---|
时区 | Europe/Amsterdam | 当前时区 | VARCHAR |
SELECT *
FROM duckdb_settings()
WHERE name = 'Calendar';
名称 | 值 | 描述 | 输入类型 |
---|---|---|---|
日历 | gregorian | 当前日历 | VARCHAR |