postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差

 更新时间:2024年08月14日 11:05:47   作者:我叫yeeking啊  
PostgreSQL提供了许多返回当前日期和时间的函数,下面这篇文章主要给大家介绍了关于postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在项目遇到一个需求是查询统计今天、昨天、本周、本月、上月、今年、去年的时间数据,最近一个月的,最近一年的月份数据,使用的是pgSql数据库:

获取当前系统时间

select now();
select current_timestamp;
结果:2020-11-04 16:09:53.247825+08

获取当前日期或时间

select current_date;
结果:2020-11-04
select current_time;
结果:16:14:08.501182+08

查询昨天的数据

select 
	DISTINCT count(id)
from 
	表名
where coalesce(l.join_date,l.sys_createdate) >= current_date - 1;

# 这里的coalesce函数,语法:coalesce(expr1,expr2,expr3...)
# 如果第一个字段存在就用第一个进行表达式判断;
# 如果第一个不存在为null则用第二个进行表达式判断;
# 如果都没有null则返回null

查询某个时间的周一

SELECT ( DATE '2020-10-23' - INTERVAL '1 day' - ( EXTRACT ( dow FROM ( DATE'2020-10-23' - INTERVAL '1 day' ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE;
# 减1 是因为得到的是以周一是星期的开始

查询本周的数据

SELECT( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE startasy,
( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE + 6 endday
	from 表名 LIMIT 1;

本周最后一天

SELECT to_char(CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2) + 6 ||' days' as interval),'yyyy-mm-dd');
# 加6天就表示是周日 不加就是本周的第一天

本月,方式一

select to_char((SELECT now() as timestamp),'mm');

本月,方式二

select * from 表名 where time >= date_trunc( 'month', now() ); 

获取上月

select to_char((select  now() - interval '1 month'),'mm');

获取今年

select to_char((SELECT now() as timestamp),'yyyy')

获取去年

select to_char((select  now() - interval '1 years'),'yyyy')

(补充)获取过去12个月或者今年月份的数据

WITH RECURSIVE T (n) AS (
SELECT DATE(to_char( to_date('2022-08', 'yyyy-MM-dd') - INTERVAL '11 month', 'yyyy-MM-dd' ))
UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE( to_char( to_date('2022-08', 'yyyy-MM-dd'), 'yyyy-MM-dd' ) )
) SELECT
to_char( n, 'yyyy-MM' ) AS MONTH
FROM T
GROUP BY
MONTH ORDER BY Month
# 只要月份修改成2022-12就表示查询今年内的所有月份

(补充)获取过去一个月内的所有天的数据

WITH RECURSIVE T ( n ) AS (
SELECT DATE
( to_char( now( ) - INTERVAL '30 day', 'yyyy-MM-dd' ) ) UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE ( to_char( now( ), 'yyyy-MM-dd' ) )
) SELECT
to_char( n, 'yyyy-MM-dd' ) AS DAYS
FROM T
GROUP BY
DAYS
ORDER BY DAYS

(补充)获取上个月每天的数据(1号-31号)

SELECT
 generate_series (
  date_trunc( 'month', CURRENT_DATE - interval '1 month'),
  date_trunc( 'month', CURRENT_DATE) - interval '1 day',
  '1 d' :: INTERVAL
 ) :: DATE days

(补充)获取本月每天的数据(1号-31号)

SELECT
 generate_series (
  date_trunc( 'month', CURRENT_DATE),
  date_trunc( 'month', CURRENT_DATE)  + '1 month -1d',
  '1 d' :: INTERVAL
 ) :: DATE days

(补充)获取某一天24小时的时刻

 select to_char(t,'yyyy-MM-DD HH24') as day
 from 
 generate_series('2022-01-01 00:00:00'::DATE,'2022-01-01 23:00:00', '1 hours') as t order by day asc;

或者这样写(方便传参):获取某一天24小时的时刻

SELECT
	to_char( T, 'yyyy-mm-dd HH24' ) AS HOUR 
FROM
	generate_series ( to_date( '2022-01-01', 'yyyy-MM-dd HH24:mi:ss' ), to_timestamp( concat ( '2022-01-01', ' 23:00:00' ), 'yyyy-mm-dd HH24:mi:ss' ), '1 hours' ) AS T 
ORDER BY
HOUR ASC;

同理,可获取某个月的所有天数据

SELECT
		to_char( T, 'yyyy-mm-dd' ) AS day
FROM
		generate_series ( to_date('2022-11', 'yyyy-MM'), (date_trunc('month', to_date('2022-11', 'yyyy-MM')) + interval '1 month - 1 day')::date, '1 days' ) AS T

同理,可获取某年的所有月份数据(上面写过相似的方法)

SELECT
	to_char( T, 'yyyy-MM' ) AS MONTH 
FROM
	generate_series ( to_date( concat ( '2022', '-01-01' ), 'yyyy-MM-dd' ), to_date( concat ( '2022', '-12-31' ), 'yyyy-MM-dd' ), '1 month' ) AS T 
ORDER BY
MONTH ASC

获取时间之间的秒差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:00:10' - TIMESTAMP '2022-08-15 17:00:00'));
结果:10

获取时间之间的分钟差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60);
结果:10

获取时间之间的小时差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 19:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60/60);
结果:2

总结 

到此这篇关于postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差的文章就介绍到这了,更多相关pgSql查询时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • postgresql 性能参数配置方式

    postgresql 性能参数配置方式

    这篇文章主要介绍了postgresql 性能参数配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL忘记postgres账号密码的解决方法

    PostgreSQL忘记postgres账号密码的解决方法

    这篇文章主要介绍了PostgreSQL忘记postgres账号的密码的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • postgresql 中round函数的用法说明

    postgresql 中round函数的用法说明

    这篇文章主要介绍了postgresql 中round函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgreSQL 使用timestamp转成date格式

    postgreSQL 使用timestamp转成date格式

    这篇文章主要介绍了postgreSQL 使用timestamp转成date格式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL 自动Vacuum配置方式

    PostgreSQL 自动Vacuum配置方式

    这篇文章主要介绍了PostgreSQL 自动Vacuum配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql中的时间戳格式化

    postgresql中的时间戳格式化

    这篇文章主要介绍了postgresql中的时间戳格式化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题

    实操解决Navicat连接postgresql时出现‘datlastsysoid does not&

    这篇文章主要介绍了实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • Mysql 8.0.33 如何迁移至 Postgresql 16.2

    Mysql 8.0.33 如何迁移至 Postgresql 16.2

    由于云平台需要改造,将Mysql替换成Postgresql,话说回来,Postgresql和Mysql语法有些差异,如何稳妥的进行迁移,下面给大家分享Mysql 8.0.33 如何迁移至 Postgresql 16.2,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • postgreSQL中的case用法说明

    postgreSQL中的case用法说明

    这篇文章主要介绍了postgreSQL中的case用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSql从库重新配置的详情

    PostgreSql从库重新配置的详情

    这篇文章主要介绍了PostgreSql从库重新配置的详情,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论