EXTRACT 函数
EXTRACT 函数返回 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 值中的日期或时间部分。示例包括时间戳中的日、月、年、小时、分钟、秒、毫秒或微秒。
语法
EXTRACT(datepart FROM source)
参数
- datepart
-
要提取的日期或时间的子字段,例如日、月、年、小时、分钟、毫秒或微秒。有关可能的值,请参阅日期或时间戳函数的日期部分。
- source
-
计算结果为 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 数据类型的列或表达式。
返回类型
如果 source 值的计算结果为数据类型 TIMESTAMP、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND,则为 INTEGER。
如果 source 值的计算结果为数据类型 TIMESTAMPTZ,则为 DOUBLE PRECISION。
TIMESTAMP 示例
以下示例确定支付价格为 10000 美元或更高的销售周数。此示例使用 TICKIT 数据。有关更多信息,请参阅 示例数据库。
select salesid, extract(week from saletime) as weeknum from sales where pricepaid > 9999 order by 2; salesid | weeknum --------+--------- 159073 | 6 160318 | 8 161723 | 26
以下示例从文本时间戳值返回分钟值。
select extract(minute from timestamp '2009-09-09 12:08:43'); date_part ----------- 8
以下示例从文本时间戳值返回毫秒值。
select extract(ms from timestamp '2009-09-09 12:08:43.101'); date_part ----------- 101
TIMESTAMPTZ 示例
以下示例从文本 timestamptz 值返回年份值。
select extract(year from timestamptz '1.12.1997 07:37:16.00 PST'); date_part ----------- 1997
TIME 示例
下面的示例表 TIME_TEST 具有一个列 TIME_VAL(类型 TIME),其中插入了三个值。
select time_val from time_test; time_val --------------------- 20:00:00 00:00:00.5550 00:58:00
以下示例从每个 time_val 中提取分钟数。
select extract(minute from time_val) as minutes from time_test; minutes ----------- 0 0 58
以下示例从每个 time_val 中提取小时数。
select extract(hour from time_val) as hours from time_test; hours ----------- 20 0 0
以下示例从文本值中提取毫秒。
select extract(ms from time '18:25:33.123456'); date_part ----------- 123
TIMETZ 示例
下面的示例表 TIMETZ_TEST 具有一个列 TIMETZ_VAL(类型 TIMETZ),其中插入了三个值。
select timetz_val from timetz_test; timetz_val ------------------ 04:00:00+00 00:00:00.5550+00 05:58:00+00
以下示例从每个 timetz_val 中提取小时数。
select extract(hour from timetz_val) as hours from time_test; hours ----------- 4 0 5
以下示例从文本值中提取毫秒。在处理提取之前,文本不会转换为 UTC。
select extract(ms from timetz '18:25:33.123456 EST'); date_part ----------- 123
以下示例从文本 timetz 值返回与 UTC 的时区偏移小时数。
select extract(timezone_hour from timetz '1.12.1997 07:37:16.00 PDT'); date_part ----------- -7
INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND 示例
以下示例从定义 36 小时(即 1 天 12 小时)的 INTERVAL DAY TO SECOND 中提取 1
的日部分。
select EXTRACT('days' from INTERVAL '36 hours' DAY TO SECOND)
date_part ------------------ 1
以下示例从定义 15 个月(即 1 年 3 个月)的 YEAR TO MONTH 中提取 3
的月份部分。
select EXTRACT('month' from INTERVAL '15 months' YEAR TO MONTH)
date_part ------------------ 3
以下示例从 30 个月(即 2 年 6 个月)中提取 6
的月份部分。
select EXTRACT('month' from INTERVAL '30' MONTH)
date_part ------------------ 6
以下示例从 50 个小时(即 2 天 2 小时)中提取 2
的小时部分。
select EXTRACT('hours' from INTERVAL '50' HOUR)
date_part ------------------ 2
以下示例从 1 小时 11 分 11.123 秒中提取 11
的分钟部分。
select EXTRACT('minute' from INTERVAL '70 minutes 70.123 seconds' MINUTE TO SECOND)
date_part ------------------ 11
以下示例从 1 天 1 小时 1 分 1.11 秒中提取 1.11
的秒部分。
select EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
date_part ------------------ 1.11
以下示例提取 INTERVAL 中的总小时数。提取每个部分并将其添加到总数中。
select EXTRACT('days' from INTERVAL '50' HOUR) * 24 + EXTRACT('hours' from INTERVAL '50' HOUR)
?column? ------------------ 50
以下示例提取 INTERVAL 中的总秒数。提取每个部分并将其添加到总数中。
select EXTRACT('days' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 86400 + EXTRACT('hours' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 3600 + EXTRACT('minutes' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 60 + EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
?column? ------------------ 90061.11