⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
日期格式化函数

The 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

The 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 8601 年份(带世纪),表示包含 ISO 周(参见 %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 时区名称。 欧洲/阿姆斯特丹
%% 字面量 % 字符。 %