九月 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
source
是TIMESTAMP
或INTERVAL
类型的值。如果传递一个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
在本教程中,您学习了如何从日期/时间或间隔值中提取字段。
了解更多
PostgreSQL 教程:日期函数
PostgreSQL 文档:时间/日期函数和操作符