⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Date Format Functions

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');

格式说明符

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

指定符 描述 示例
%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
%% 一个字面的 % 字符。 %