关于在PostgreSQL中使用extract函数以及epoch

起因是看不懂以下SQL

 1 SELECT
 2             province_org_id,
 3             1.0 AS bl,
 4             outage_respon_code AS tdzrm,
 5             round(
 6                 EXTRACT (
 7                     epoch 
 8                 FROM
 9                     (
10                     CASE
11                             
12                             WHEN to_timestamp ( '', 'YYYY-MM-DD HH24:MI:SS' ) > outage_e_time THEN
13                             outage_e_time ELSE to_timestamp ( '', 'YYYY-MM-DD HH24:MI:SS' ) 
14                         END -
15                     CASE
16                             
17                             WHEN outage_s_time > to_timestamp ( '', 'YYYY-MM-DD HH24:MI:SS' ) THEN
18                             outage_s_time ELSE to_timestamp ( '', 'YYYY-MM-DD HH24:MI:SS' ) 
19                         END 
20                         ) 
21                     ) :: NUMERIC 
22                 ) / 60 / 60 AS CXSJ 
23             FROM
24                 pdr_outage_mvcons 
--空字符串是传参,我给转成空字符串了,要不不好看

extract (field from source)
extract函数是从日期或者时间数值里面抽取子域,比如年、月、日等。source必须是timestamp、time、interval类型的值表达式。field是一个标识符或字符串,其具有很多的枚举值。

新纪元时间 Epoch也是field的一种, 是以 1970-01-01 00:00:00 UTC 为标准的时间,将目标时间与 1970-01-01 00:00:00
时间的差值以秒来计算 ,单位是秒,可以是负值; 有些应用会将时间存储成epoch 时间形式,以提高读取效率。官网解释为:

对于日期和时间戳类型的值,会获取到从1970-01-01 00:00:00 UTC这个Linux纪元年的开始时间到给定的日期或者时间戳参数的时间之间相隔的秒数。

而对于interval这种时间间隔类型,这会获取到这个时间间隔对应的秒数目。

所以以上SQL的含义不言而喻,就是想获取这段时间来作为停电的持续时间;但是不明白为什么加了一个转成numric类型的函数

以下是几个用法:

保留原来的毫秒值


select extract(epoch from '03:21:06.678'::time);
这个extract(epoch from )函数得到的是时间是秒单位,如果需要毫秒值就直接乘以1000:
select extract(epoch from now())*1000;

去掉原来的毫秒值

1 向下取整函数floor()
2 select floor(extract(epoch from '03:21:06.678'::time));
3 向上取整函数ceil()或ceiling(),这两个一样的
4 select ceil(extract(epoch from '03:21:06.678'::time));
5 select ceiling(extract(epoch from '03:21:06.678'::time));
6 四舍五入函数round()
7 select round(extract(epoch from '03:21:06.678'::time));

将两个日期间的时间转换为秒值

1 select extract(epoch from(('2018-12-18 00:00:10'::timestamp - '2018-12-18 00:00:00')));
2 select extract(epoch from(('2018-12-18 00:00:10' - '2018-12-18 00:00:00'::timestamp)));
3 select extract(epoch from(('2018-12-18 00:00:10' - timestamp'2018-12-18 00:00:00')));
4 select extract(epoch from((timestamp'2018-12-18 00:00:10' - '2018-12-18 00:00:00')));

特殊:

上述只能做时分秒天,并不能做年月,因为不确定性,如有相关业务需要使用特定的方式
SELECT date_part('year', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00'))*12 + date_part('month', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00')) 月;
--结果:18
SELECT date_part('year', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00')) + date_part('month', age(TIMESTAMP '2023-02-17 20:00:00' , TIMESTAMP '2021-08-17 20:00:00'))/12 年;
--结果:1.5

参考来源:

PostgreSQL - 怎么将时间转换成秒 - 雨临Lewis - 博客园 (cnblogs.com)

PostgreSQL中epoch的用法 - 问答 - 亿速云 (yisu.com)

PostgreSQL 关于时间复杂函数详解(长期更)_postgresql 时间一刻钟-CSDN博客

pgsql中epoch用法_pgsql epoch-CSDN博客

PostgreSQL中epoch的用法 - 空谷幽兰~泊逸 - 博客园 (cnblogs.com)

 

posted @ 2024-04-25 02:19  明月镇魂  阅读(1243)  评论(0编辑  收藏  举报