目录
- 前言
- 获取当前系统时间
- 获取当前日期或时间
- 查询昨天的数据
- 查询某个时间的周一
- 查询本周的数据
- 本周最后一天
- 本月,方式一
- 本月,方式二
- 获取上月
- 获取今年
- 获取去年
- (补充)获取过去12个月或者今年月份的数据
- (补充)获取过去一个月内的所有天的数据
- (补充)获取上个月每天的数据(1号-31号)
- (补充)获取本月每天的数据(1号-31号)
- (补充)获取某一天24小时的时刻
- 或者这样写(方便传参):获取某一天24小时的时刻
- 同理,可获取某个月的所有天数据
- 同理,可获取某年的所有月份数据(上面写过相似的方法)
- 获取时间之间的秒差
- 获取时间之间的分钟差
- 获取时间之间的小时差
- 总结
前言
在项目遇到一个需求是查询统计今天、昨天、本周、本月、上月、今年、去年的时间数据,最近一个月的,最近一年的月份数据,使用的是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查询时间内容请搜索编程客栈(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java FX 在可访问性方面都有哪些重要的考虑呢?(java javafx在可访问性方面有哪些考虑 )
- Java 的 domain 具体有哪些合法的格式呢?(Java的domain有哪些合法格式)
- Java 中 shuffle 函数的参数该如何设置?(Java中shuffle函数的参数设置)
- Java 重构到底有哪些作用呢?(Java重构有什么用)
- 在 Java 中如何利用 Vector 来定义二维数组?(java中怎么用vector定义二维数组)
- 为何 Java 环境变量配置总是难以成功?(java环境变量配置为什么不成功)
- 如何配置 Java 文件上传接口?(java文件上传接口怎么配置)
- 如何在 JAVA 中直接读取文件流内容?(JAVA怎么直接读取文件流内容)
- 如何将 Java 文件转换为可执行文件?(java文件如何变成可执行文件)
- 如何合理设置缓存池大小?(缓存池大小如何设置)
猜你喜欢
AI推送时光机 咦!没有更多了?去看看其它编程学习网 内容吧