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');
格式说明符
以下是所有可用格式说明符的完整列表。
指定符 | 描述 | 示例 |
---|---|---|
%a |
缩写的星期名称。 | Sun, Mon, … |
%A |
完整的星期名称。 | 星期日, 星期一, … |
%b |
缩写的月份名称。 | Jan, Feb, …, Dec |
%B |
完整的月份名称。 | 一月, 二月, … |
%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 |
%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日的那一周。 | 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 |
时区名称。 | Europe/Amsterdam |
%% |
一个字面的 % 字符。 |
% |