⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
日期格式化函数

strftimestrptime 函数可用于在 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 函数中指定。这可以通过设置 DATEFORMATTIMESTAMPFORMAT(或两者同时指定)来实现。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', timestampformat = '%A, %-d %B %Y - %I:%M:%S %p');

格式说明符

以下是所有可用格式说明符的完整列表。

说明符 描述 示例
%a 星期几的缩写名称。 Sun, Mon, …
%A 星期几的全称。 Sunday, Monday, …
%b 月份的缩写名称。 Jan, Feb, …, Dec
%B 月份的全称。 January, February, …
%c ISO 日期和时间表示 1992-03-02 10:30:20
%d 月份中的日期,以零填充的十进制数表示。 01, 02, …, 31
%-d 月份中的日期,以十进制数表示。 1, 2, …, 30
%f 微秒,以十进制数表示,左侧填充零。 000000 - 999999
%g 毫秒,以十进制数表示,左侧填充零。 000 - 999
%G 包含 ISO 周大部分时间的 ISO 8601 年份(见 %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 周是包含 1 月 4 日的那一周。请注意,%V 与年份指令 %Y 不兼容。请改用 ISO 年份 %G 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 的时差,格式为 ±HH:MM、±HHMM 或 ±HH。 -0700
%Z 时区名称。 欧洲/阿姆斯特丹
%% 字面量 % 字符。 %
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南