函式(日期的擷取和四捨五入)
ROUND()函式與TRUNC()函式除了可以作用在數值上,也可以作用在日期上,對於日期也同樣可以四捨五入或截斷
ROUND(引數1,引數2)/TRUNC(引數1,引數2)
引數1:需要處理的資料
引數2:將資料按照引數2的格式進行處理
格式:YYYY MM DD HH24/HH12 MI SS DAY/IW
一.ROUND()四捨五入
1.對年份處理 以七月為界 七月之前返回當前年份第一天,七月之後返回下個年份第一天
示例:
SELECT TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’) FROM DUAL;
SELECT ROUND(TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’),‘YYYY’) FROM DUAL;–2020/01/01
SELECT ROUND(TO_DATE('2020/06/30 23:59:59','YYYY-MM-DD HH24:MI:SS'),'YYYY') FROM DUAL;--2020/01/01
SELECT ROUND(TO_DATE('2020/07/01 00:00:00','YYYY-MM-DD HH24:MI:SS'),'YYYY') FROM DUAL;--2021/01/01
2.對月份處理 以16為界 16之前返回當前月份第一天,16之後返回下個月份第一天
示例:
SELECT TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’) FROM DUAL;
SELECT ROUND(TO_DATE(‘2020/04/15’,‘YYYY-MM-DD’),‘MM’) FROM DUAL;–2020/04/01
SELECT ROUND(TO_DATE('2020/06/15 23:59:59','YYYY-MM-DD HH24:MI:SS'),'MM') FROM DUAL;--2020/06/01
SELECT ROUND(TO_DATE('2020/06/16 00:00:00','YYYY-MM-DD HH24:MI:SS'),'MM') FROM DUAL;--2020/07/01
3.對日處理 以12點為界 12點之前返回當前日期,12之後返回下一天日期
SELECT TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’) FROM DUAL;
SELECT ROUND(TO_DATE(‘2020/04/26 11:59:59’,‘YYYY-MM-DD HH24:MI:SS’),‘DD’) FROM DUAL;–2020/04/26
SELECT ROUND(TO_DATE(‘2020/04/26 12:00:00’,‘YYYY-MM-DD HH24:MI:SS’),‘DD’) FROM DUAL;–2020/04/27
4.對小時處理 以30分為界 30之前返回當前時間,30之後返回下一小時時間
示例:
SELECT TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’) FROM DUAL;
SELECT ROUND(TO_DATE(‘2020/04/26 12:29:59’,‘YYYY-MM-DD HH24:MI:SS’),‘HH24’) FROM DUAL;–2020/04/26 12:00:00
SELECT ROUND(TO_DATE(‘2020/04/26 12:30:00’,‘YYYY-MM-DD HH24:MI:SS’),‘HH24’) FROM DUAL;–2020/04/26 13:00:00
–分鐘 秒均以此原理
6.DAY 以週三的12點為界 12點之前返回本週第一天 12點之後返回下一週的第一天
(第一天以週日開始)
示例:
SELECT ROUND(TO_DATE('2021/01/20 11:59:59','YYYY-MM-DD HH24:MI:SS'),'DAY') FROM DUAL;--2021/01/17
SELECT ROUND(TO_DATE('2021/01/20 12:00:00','YYYY-MM-DD HH24:MI:SS'),'DAY') FROM DUAL;--2021/01/24
7.IW 以週四的12點為界 12點之前返回本週第一天 12點之後返回下一週的第一天
(第一天以週一開始)
示例:
SELECT ROUND(TO_DATE('2021/01/20 11:59:59','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/18
SELECT ROUND(TO_DATE('2021/01/20 12:00:00','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/18
SELECT ROUND(TO_DATE('2021/01/21 11:59:59','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/18
SELECT ROUND(TO_DATE('2021/01/21 12:00:00','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/25
SELECT ROUND(TO_DATE('2021/01/21 11:59:59','YYYY-MM-DD HH12:MI:SS'),'IW') FROM DUAL;--2021/01/18
SELECT ROUND(TO_DATE('2021/01/21 01:00:00 下午','YYYY-MM-DD HH12:MI:SS PM'),'IW') FROM DUAL;--2021/01/25
二.TRUNC() 擷取
–只返回當前精度的初始時間,用於查詢本週、當年、本月第一天的日期
示例:
SELECT TRUNC(TO_DATE(‘2020/04/26’,‘YYYY-MM-DD’),‘YYYY’) FROM DUAL;–2020/01/01
SELECT TRUNC(TO_DATE(‘2020/07/26’,‘YYYY-MM-DD’),‘YYYY’) FROM DUAL;–2020/01/01
SELECT TRUNC(TO_DATE('2020/06/15 23:59:59','YYYY-MM-DD HH24:MI:SS'),'MM') FROM DUAL;--2020/06/01
SELECT TRUNC(TO_DATE('2020/06/16 00:00:00','YYYY-MM-DD HH24:MI:SS'),'MM') FROM DUAL;--2020/06/01
SELECT TRUNC(TO_DATE('2021/01/20 11:59:59','YYYY-MM-DD HH24:MI:SS'),'DAY') FROM DUAL;--2021/01/17
SELECT TRUNC(TO_DATE('2021/01/20 12:00:00','YYYY-MM-DD HH24:MI:SS'),'DAY') FROM DUAL;--2021/01/17
SELECT TRUNC(TO_DATE('2021/01/21 11:59:59','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/18
SELECT TRUNC(TO_DATE('2021/01/21 12:00:00','YYYY-MM-DD HH24:MI:SS'),'IW') FROM DUAL;--2021/01/18
思考:假設有一張銷售業績表,查詢上個周的業績總額(時間以今天為基)
SELECT SUM(AMOUNT)
FROM SALES
WHERE STIME BETWEEN TRUNC(SYSDATE, 'IW') - 7 AND
TRUNC(SYSDATE, 'IW') - 1;