zoukankan      html  css  js  c++  java
  • PostgreSQL 时间转换

    背景:最近频繁使用到时间转换相关的操作,特此小记。

    1、实时取最近24小时内数据。

    select now() - interval '24h';
    通过sql获得符合要求的时间段,当做where条件即可。如:

    select * from table1 where createTime between now() - interval '24h' and now() 
    

    '24h' 等同于 '24 hour',更多参数见文档。

    2、时间差转换为时、分、秒。

    关键函数:EXTRACT(field FROM source)、date_part('field', source)

    SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00') 秒;
    --结果:3600
    SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60 分钟;
    --结果:60
    SELECT date_part('epoch', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60/60 小时;
    --结果:1
    SELECT date_part('epoch', TIMESTAMP '2022-08-17 20:00:00' - TIMESTAMP '2021-08-17 20:00:00')/60/60/24 天; 
    --结果:365,如果不需要精确到小数有更简单的: 
    SELECT date '2022-08-17' - date '2021-08-17' 天;
    --结果:365
    

    月和年的天数不确定,不能用以上方法,需要分别计算相加,如:

    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
    

    以上示例均可使用extract函数,如:

    SELECT extract(EPOCH FROM TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00') 秒;
    --结果:3600,此处不再一一举例
    

    3、注意

    3.1 field域值

    field可以是day、month、minute、year,也可以是:dow(一周中的日,从周日(0)到周六(6))、doy(一年的第几天(1–365/366)),等等、、、但是前者获取的只是域值。如:

    SELECT date_part('hour', TIMESTAMP '2021-08-17 20:00:00');
    --结果:20
    SELECT date_part('hour', TIMESTAMP '2021-08-17 21:00:00' - TIMESTAMP '2021-08-17 20:00:00');
    SELECT date_part('hour', TIMESTAMP '2021-08-18 21:00:00' - TIMESTAMP '2021-08-17 20:00:00');
    --结果: 1
    结果相同都是1,并不会做跨天的处理。
    
    3.2 epoch

    对于timestamp with time zone值, 是自 1970-01-01 00:00:00 UTC 以来的秒数(结果可能是负数); 对于date and timestamp值,是自本地时间 1970-01-01 00:00:00 以来的描述;对于interval值,它是时间间隔的总秒数 (简单理解就是秒数差值......)

    4、附上链接

    时间/日期函数和操作(官网)
    时间/日期函数和操作(中文)

    测试签名
  • 相关阅读:
    死锁分析-(DML+DDL触发Server层死锁)
    archery 1.80推送工单到飞书webhook失败解决方案
    mysql执行计划 Select tables optimized away
    apparmor mysql_Ubuntu 上更改 MySQL 数据库数据存储目录
    查看docker容器的tcp连接(转)
    Mongo副本集搭建方式
    数据库字段命名方法
    C# DataGridview控件自动下拉到最后一行
    C# datagridview绑定List<string>显示的是数据长度
    DataGridView 清空数据
  • 原文地址:https://www.cnblogs.com/WinterSir/p/15154546.html
Copyright © 2011-2022 走看看