PostgreSQL 教程: extract 函数

九月 20, 2023

PostgreSQL 的EXTRACT()函数从日期/时间值中提取年、月、日等字段。

语法

下面说明了EXTRACT()函数的语法:

EXTRACT(field FROM source)

参数

PostgreSQL 的EXTRACT()函数需要两个参数:

1) field

field参数指定从日期/时间值中提取哪个字段。

下表说明了有效的字段值:

字段值 时间戳 间隔
CENTURY 世纪 世纪数
DAY 一月中的第几天 (1-31) 天数
DECADE 年份除以 10 得到的十年 与时间戳相同
DOW 星期几,星期日 (0) 至星期六 (6) 不适用
DOY 一年中的第几天,范围从 1 到 366 不适用
EPOCH 自 1970-01-01 00:00:00 UTC 以来的秒数 间隔内的总秒数
HOUR 小时 (0-23) 小时数
ISODOW 基于 ISO 8601 的星期几,星期一 (1) 至星期日 (7) 不适用
ISOYEAR 基于 ISO 8601 的一年中的第几周 不适用
MICROSECONDS 秒字段,包括小数部分,乘以 1000000 与时间戳相同
MILLENNIUM 几千年 千年数
MILLISECONDS 秒字段,包括小数部分,乘以 1000 与时间戳相同
MINUTE 分钟 (0-59) 分钟数
MONTH 月份,1-12 月数,取模 (0-11)
QUARTER 一年中的季度 季度数
SECOND 秒数
TIMEZONE 与 UTC 的时区偏移量,以秒为单位 不适用
TIMEZONE_HOUR 时区偏移量的小时部分 不适用
TIMEZONE_MINUTE 时区偏移量的分钟部分 不适用
WEEK ISO 8601 周编号的一年中的第几周 不适用
YEAR 年份 与时间戳相同

2) source

sourceTIMESTAMPINTERVAL类型的值。如果传递一个DATE值,该函数会将其转换为一个TIMESTAMP值。

返回值

EXTRACT()函数返回一个双精度浮点数值。

示例

A) 从时间戳中提取的示例

从时间戳中提取年份:

SELECT EXTRACT(YEAR FROM TIMESTAMP '2016-12-31 13:30:15');

结果如下:

2016

从时间戳中提取季度:

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2016-12-31 13:30:15');

结果是

4

从时间戳中提取月份:

SELECT EXTRACT(MONTH FROM TIMESTAMP '2016-12-31 13:30:15');

结果如下:

12

从时间戳中提取日:

SELECT EXTRACT(DAY FROM TIMESTAMP '2016-12-31 13:30:15');

这是结果: 31

从时间戳中提取世纪:

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2016-12-31 13:30:15');

正如预期的那样,它返回了 21:

21

从时间戳中提取十年:

SELECT EXTRACT(DECADE FROM TIMESTAMP '2016-12-31 13:30:15');

结果如下:

201

从时间戳中提取星期几:

SELECT EXTRACT(DOW FROM TIMESTAMP '2016-12-31 13:30:15');

结果是:

6

从时间戳中提取一年中的第几天:

SELECT EXTRACT(DOY FROM TIMESTAMP '2016-12-31 13:30:15');

它返回 366:

366

从时间戳中提取自 1970-01-01 00:00:00 UTC 以来的秒数:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2016-12-31 13:30:15');

结果是:

1483191015

从时间戳中提取小时部分:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2016-12-31 13:30:15');

结果:

13

从时间戳中提取分钟部分:

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2016-12-31 13:30:15');

结果如下:

30

从时间戳中提取秒部分:

SELECT EXTRACT(SECOND FROM TIMESTAMP '2016-12-31 13:30:15.45');

结果包括秒及其小数部分:

15.45

根据 ISO 8601 提取工作日:

SELECT EXTRACT(ISODOW FROM TIMESTAMP '2016-12-31 13:30:15');

从时间戳中提取毫秒:

SELECT EXTRACT(MILLISECONDS FROM TIMESTAMP '2016-12-31 13:30:15');

结果是 15 * 1000 = 15000

15000

从时间戳中提取微秒:

SELECT EXTRACT(MICROSECONDS FROM TIMESTAMP '2016-12-31 13:30:15');

结果是 15 * 1000000 = 15000000

15000000

B) 从间隔值中提取的示例

从间隔值中提取年份:

SELECT EXTRACT(YEAR FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

6

从间隔值中提取季度:

SELECT EXTRACT(QUARTER FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

2

从间隔值中提取月份:

SELECT EXTRACT(MONTH FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

5

从间隔值中提取日:

SELECT EXTRACT(DAY FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

4

从间隔值中提取小时部分:

SELECT EXTRACT(HOUR FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

3

从间隔值中提取分钟部分:

SELECT EXTRACT(MINUTE FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

2

从间隔值中提取秒数部分:

SELECT EXTRACT(SECOND FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

1

从间隔值中提取毫秒:

SELECT EXTRACT(MILLISECONDS FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

1000

从间隔值中提取微秒:

SELECT EXTRACT(MICROSECONDS FROM INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

1000000

从间隔值中提取十年:

SELECT EXTRACT(DECADE FROM INTERVAL '60 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

60

从间隔值中提取千年:

SELECT EXTRACT(MILLENNIUM FROM INTERVAL '1999 years 5 months 4 days 3 hours 2 minutes 1 second' );

结果

1

从间隔值中提取世纪:

SELECT EXTRACT(CENTURY FROM INTERVAL '1999 years 5 months 4 days 3 hours 2 minutes 1 second' ); 

结果

19

在本教程中,您学习了如何从日期/时间或间隔值中提取字段。