1. 程式人生 > 其它 >函式(日期的擷取和四捨五入)

函式(日期的擷取和四捨五入)

技術標籤:筆記sql資料庫

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/07/26’,‘YYYY-MM-DD’),‘YYYY’) FROM DUAL;–2021/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/26’,‘YYYY-MM-DD’),‘MM’) FROM DUAL;–2020/05/01
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;