postgresql查詢今天、昨天、本周、本月、上月、今年、去年的時(shí)間以及計(jì)算時(shí)間之差
前言
在項(xiàng)目遇到一個(gè)需求是查詢統(tǒng)計(jì)今天、昨天、本周、本月、上月、今年、去年的時(shí)間數(shù)據(jù),最近一個(gè)月的,最近一年的月份數(shù)據(jù),使用的是pgSql數(shù)據(jù)庫(kù):
獲取當(dāng)前系統(tǒng)時(shí)間
select now(); select current_timestamp; 結(jié)果:2020-11-04 16:09:53.247825+08
獲取當(dāng)前日期或時(shí)間
select current_date; 結(jié)果:2020-11-04
select current_time; 結(jié)果:16:14:08.501182+08
查詢昨天的數(shù)據(jù)
select DISTINCT count(id) from 表名 where coalesce(l.join_date,l.sys_createdate) >= current_date - 1; # 這里的coalesce函數(shù),語(yǔ)法:coalesce(expr1,expr2,expr3...) # 如果第一個(gè)字段存在就用第一個(gè)進(jìn)行表達(dá)式判斷; # 如果第一個(gè)不存在為null則用第二個(gè)進(jìn)行表達(dá)式判斷; # 如果都沒有null則返回null
查詢某個(gè)時(shí)間的周一
SELECT ( DATE '2020-10-23' - INTERVAL '1 day' - ( EXTRACT ( dow FROM ( DATE'2020-10-23' - INTERVAL '1 day' ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE; # 減1 是因?yàn)榈玫降氖且灾芤皇切瞧诘拈_始
查詢本周的數(shù)據(jù)
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')
(補(bǔ)充)獲取過去12個(gè)月或者今年月份的數(shù)據(jù)
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就表示查詢今年內(nèi)的所有月份
(補(bǔ)充)獲取過去一個(gè)月內(nèi)的所有天的數(shù)據(jù)
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
(補(bǔ)充)獲取上個(gè)月每天的數(shù)據(jù)(1號(hào)-31號(hào))
SELECT generate_series ( date_trunc( 'month', CURRENT_DATE - interval '1 month'), date_trunc( 'month', CURRENT_DATE) - interval '1 day', '1 d' :: INTERVAL ) :: DATE days
(補(bǔ)充)獲取本月每天的數(shù)據(jù)(1號(hào)-31號(hào))
SELECT generate_series ( date_trunc( 'month', CURRENT_DATE), date_trunc( 'month', CURRENT_DATE) + '1 month -1d', '1 d' :: INTERVAL ) :: DATE days
(補(bǔ)充)獲取某一天24小時(shí)的時(shí)刻
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小時(shí)的時(shí)刻
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;
同理,可獲取某個(gè)月的所有天數(shù)據(jù)
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
同理,可獲取某年的所有月份數(shù)據(jù)(上面寫過相似的方法)
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
獲取時(shí)間之間的秒差
SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:00:10' - TIMESTAMP '2022-08-15 17:00:00')); 結(jié)果:10
獲取時(shí)間之間的分鐘差
SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60); 結(jié)果:10
獲取時(shí)間之間的小時(shí)差
SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 19:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60/60); 結(jié)果:2
總結(jié)
到此這篇關(guān)于postgresql查詢今天、昨天、本周、本月、上月、今年、去年的時(shí)間以及計(jì)算時(shí)間之差的文章就介紹到這了,更多相關(guān)pgSql查詢時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL忘記postgres賬號(hào)密碼的解決方法
這篇文章主要介紹了PostgreSQL忘記postgres賬號(hào)的密碼的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01postgresql 中round函數(shù)的用法說(shuō)明
這篇文章主要介紹了postgresql 中round函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-01-01postgreSQL 使用timestamp轉(zhuǎn)成date格式
這篇文章主要介紹了postgreSQL 使用timestamp轉(zhuǎn)成date格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-01-01實(shí)操解決Navicat連接postgresql時(shí)出現(xiàn)‘datlastsysoid does not&
這篇文章主要介紹了實(shí)操解決Navicat連接postgresql時(shí)出現(xiàn)‘datlastsysoid does not exist‘報(bào)錯(cuò)的問題,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12Mysql?8.0.33?如何遷移至?Postgresql?16.2
由于云平臺(tái)需要改造,將Mysql替換成Postgresql,話說(shuō)回來(lái),Postgresql和Mysql語(yǔ)法有些差異,如何穩(wěn)妥的進(jìn)行遷移,下面給大家分享Mysql?8.0.33?如何遷移至?Postgresql?16.2,感興趣的朋友跟隨小編一起看看吧2024-05-05