1. 程式人生 > >oracle中對時間和時間戳的一些常規用法

oracle中對時間和時間戳的一些常規用法

1、加減日月年


在oracle中date型別可以直接加減天數,月份要用 add_months 函式

SELECT
    SYSDATE 今天,
    SYSDATE - 5 減5天,
    SYSDATE + 5 加5天,
    add_months(SYSDATE,+5) 加5個月,
    add_months(SYSDATE,-5) 減5個月,
    add_months(SYSDATE,+5*12) 加年,
    add_months(SYSDATE,-5*12) 減5年
FROM
    dual

 

2、加減時分秒

 先臨時修改時間格式:

alter session set nls_date_format='yyyy-mm-DD HH24:MI:SS'

 

SELECT
    SYSDATE 今天,
    SYSDATE - 5/24/60/60 減5秒,
    SYSDATE + 5/24/60/60 加5秒,
    SYSDATE - 5/24/60    減5分,
    SYSDATE + 5/24/60    加5分,
    SYSDATE - 5/24       減5小時,
    SYSDATE + 5/24       加5小時
FROM
    dual;

3、日期間隔時分秒

 兩個date型別相減就是天數,乘以24就是小時,以此類推就可以算出秒

 

SELECT
    間隔天數,
    間隔天數 * 24 AS 間隔小時,
    間隔天數 * 24 * 60 AS 間隔分,
    間隔天數 * 24 * 60 * 60 AS 間隔秒
FROM
    (
        SELECT
            SYSDATE - start_date AS 間隔天數
        FROM
            td_notice
        WHERE
            ROWNUM <= 1
    )

 

 4、日期間隔日月年

SELECT
    one-two  間隔天,
    months_between(one,two) 間隔月,
    months_between(one,two)/12 間隔年
FROM
    (
        SELECT
            SYSDATE as one,
            SYSDATE-400 as two
        FROM
           dual
    )

 5、其他操作

獲得當月月初

SELECT
    SYSDATE 當前日期,
    TO_DATE(
        TO_CHAR(SYSDATE,'yyyy-mm')
         || '-1',
        'yyyy-mm-dd'
    ) 月初
FROM
    dual

 

 

SELECT
    SYSDATE 當前日期,
    trunc(SYSDATE,'mm') 月初
FROM
    dual

 

 

select  sysdate,
        to_number(to_char(sysdate,'hh24')) 時,
        to_number(to_char(sysdate,'mi')) 分,
        to_number(to_char(sysdate,'ss')) 秒,
        to_number(to_char(sysdate,'dd')) 日,
        to_number(to_char(sysdate,'mm')) 月,
        to_number(to_char(sysdate,'yyyy')) 年,
        to_number(to_char(sysdate,'ddd')) 年內第幾天,
        trunc(sysdate,'dd') 一天之始,
        trunc(sysdate,'day') 周初,
        trunc(sysdate,'mm') 月初,
        last_day(sysdate) 月末,
        trunc(sysdate,'yy') 年初,
        to_char(sysdate,'day') 周幾,
        to_char(sysdate,'month') 月份 
from dual

6 時間戳的操作

 別名不能用單引號,可以用雙引號或不用引號

--別名不能用單引號,可以用雙引號或不用引號
SELECT
    systimestamp,
    EXTRACT(YEAR FROM systimestamp) AS "year",
    EXTRACT(MONTH FROM systimestamp) AS "month",
    EXTRACT(DAY FROM systimestamp) AS "day",
    EXTRACT(HOUR FROM systimestamp) AS "hour",
    EXTRACT(MINUTE FROM systimestamp) AS "minute",
    EXTRACT(SECOND FROM systimestamp) AS "second"
FROM
    dual

extract 不能去date型別中的時分秒 

7  確定一年是否為閏年

主要是看二月月末是哪一天

select trunc(sysdate,'y') 年初 from dual;
select add_months(trunc(sysdate,'y'),1) 二月初 from dual;
select last_day(add_months(trunc(sysdate,'y'),1)) 二月底 from dual;

select to_char(last_day(add_months(trunc(sysdate,'y'),1)),'DD') 日 from dual;

 

8、建立本月日曆

列舉指定月份的所有日期,並轉化為對應的周資訊,再按所在周做一次“”行轉列”” 即可

--1給定一個日期
with x1 as (select to_date('2018-11-11','yyyy-mm-dd') as cur_date from dual), 
--2取月初
     x2 as  (select trunc(cur_date,'mm') as 月初,add_months(trunc(cur_date,'mm'),1) as 下月初 from  x1),
--3列舉當月所有天
     x3 as  (select 月初 + (level - 1) as 日 from x2 connect by level <=(下月初-月初)),
--4提取周資訊
     x4 as  (select to_char(日,'iw') 所在周,
                    to_char(日,'dd')  日期,
                    to_number(to_char(日,'d')) 周幾
                    from x3)
                    
select  max(case 周幾 when 2 then 日期 end) 週一,                   
        max(case 周幾 when 3 then 日期 end) 週二,   
        max(case 周幾 when 4 then 日期 end) 週三,
        max(case 周幾 when 5 then 日期 end) 週四,
        max(case 周幾 when 6 then 日期 end) 週五,
        max(case 周幾 when 7 then 日期 end) 週六,   
        max(case 周幾 when 1 then 日期 end) 週日
    from x4 group by 所在周 order by 所在周;

 

9、時間的比較

date 型別可以直接用> 、=或<比較
也可以用between d1 and d2  (類似於>=d1 and <=d2,其中d1、d2為date型別)     

在oracle中時間字串格式也可以比較 ,這是我無意間發現的,感覺很神奇

select id,CREATE_DATE from student where to_char(CREATE_DATE,'yyyy-mm-dd') >= '2018-11-15' 

把時間轉換成字串直接可以和時間字串比較

select id,CREATE_DATE from student where '2018-11-16' >= '2018-11-15' 		
select id,CREATE_DATE from student where '2018-11-16' <= '2018-11-15'

上面這兩條sql

第一條以為where後面時間字串比較返回true,因此查詢出所有資料,第二條則相反什麼也沒返回