日期格式函数
strftime 和 strptime 函数可用于在 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 函数中指定。你可以设置 DATEFORMAT 或 TIMESTAMPFORMAT(也可以同时设置)。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 etc. |
%z | 相对 UTC 的时间偏移,格式为 ±HH:MM、±HHMM 或 ±HH。 | -0700 |
%Z | 时区名称。 | Europe/Amsterdam |
%% | 字面量 % 字符。 | % |