跳到主要内容

日期格式函数

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, ...
%cISO 日期和时间表示。1992-03-02 10:30:20
%d月内日期,十进制并在左侧补零。01, 02, ..., 31
%-d月内日期,十进制。1, 2, ..., 30
%f微秒,十进制并在左侧补零。000000 - 999999
%g毫秒,十进制并在左侧补零。000 - 999
%GISO 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
%uISO 8601 星期,十进制,1 表示星期一。1, 2, ..., 7
%U一年中的周数。第 01 周从当年首个星期日开始,因此可能存在第 00 周。注意这不符合 ISO-8601 的周日期标准。00, 01, ..., 53
%VISO 8601 周数,星期一为一周第一天。第 01 周是包含 1 月 4 日的那一周。注意 %V 与年份指令 %Y 不兼容,请改用 ISO 年 %G01, ..., 53
%w星期几,十进制。0, 1, ..., 6
%W一年中的周数。第 01 周从当年首个星期一开始,因此可能存在第 00 周。注意这不符合 ISO-8601 的周日期标准。00, 01, ..., 53
%xISO 日期表示。1992-03-02
%XISO 时间表示。10:30:20
%y不带世纪的年份,十进制并在左侧补零。00, 01, ..., 99
%-y不带世纪的年份,十进制。0, 1, ..., 99
%Y带世纪的年份,十进制。2013, 2019 etc.
%z相对 UTC 的时间偏移,格式为 ±HH:MM、±HHMM 或 ±HH。-0700
%Z时区名称。Europe/Amsterdam
%%字面量 % 字符。%