当前位置:   article > 正文

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

pgsql按周查询

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

获取当前系统时间

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

获取当前日期或时间

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

查询昨天的数据

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

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

查询某个时间的周一

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

查询本周的数据

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;
  • 1
  • 2
  • 3

本周最后一天

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

本月,方式一

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

本月,方式二

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

获取上月

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

获取今年

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

获取去年

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

(补充)获取过去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就表示查询今年内的所有月份
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(补充)获取上个月每天的数据(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
  • 2
  • 3
  • 4
  • 5
  • 6

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

SELECT
 generate_series (
  date_trunc( 'month', CURRENT_DATE),
  date_trunc( 'month', CURRENT_DATE)  + '1 month -1d',
  '1 d' :: INTERVAL
 ) :: DATE days
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(补充)获取某一天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;
  • 1
  • 2
  • 3

或者这样写(方便传参):获取某一天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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

  • 1
  • 2
  • 3
  • 4
  • 5

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

获取时间之间的秒差

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

获取时间之间的分钟差

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

获取时间之间的小时差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 19:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60/60);
结果:2
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/406391
推荐阅读
相关标签
  

闽ICP备14008679号