Oracle時間日期函式及sql語句
一、時間日期函式
- to_date函式
to_date的格式:to_date(‘要轉換的時間’,’轉換成的時間格式’), 兩個引數的格式必須匹配,否則會報錯。
需要注意的是,在Java中的時間格式是“yyyy-MM-dd HH:mm:ss”,但是在oracle的sql中由於不區分大小寫,時間格式中的“mm”將被識別為月,導致出現“ORA 01810 格式程式碼出現兩次”的錯誤。所以Oracle的SQL採用了mi代替分鐘,oracle的全時間格式為“yyyy-MM-dd HH24:mi:ss”。同時,要以24小時時間的形式顯示出來要用HH24,而不是HH。
- to_char(日期,”轉換格式” )
即把給定的日期按照“轉換格式”轉換。
轉換的格式: yyyy 用4位數表示年,mm 用2位數字表示月,dd 表示當月第幾天。同時,用q表示季度,用ww 來表示當年第幾周,w用來表示當月第幾周。ddd表示當年第幾天,dd 表示當月第幾天,d表示這個星期的第幾天。
時間相關的sql語句
(1) 查詢轉換時間格式
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
(2) 取得當前日期是一個星期中的第幾天
select to_char(sysdate,'D') from dual; ---取得當前日期是一個星期中的第幾天
ps:根據上面列出的轉換格式,有很多類似的查詢如下:
select to_char(sysdate,'Q') from dual; --當前日期所在季度 select to_char(sysdate,'mm') from dual; --當前日期在本年的第幾個月 select to_char(sysdate,'ww') from dual; --當前日期是‘本年’的第幾周 select to_char(sysdate,'w') from dual; --當前日期是‘本月’的第幾周 select to_char(sysdate,'ddd') from dual; --當前日期是本年第幾天 select to_char(sysdate,'dd') from dual; --當前日期是本月第幾天
(3) 取當前日期是星期幾中文顯示
select to_char(sysdate,'day') from dual;
(4) 給現有日期加/減月(年)份
這裡是使用add_months函式實現年月的加減。add_months是運算函式,函式將傳入的日期上加上/減去月份數,所以,日期中的日一般是不變的。然而,如果傳入的日期是某月的最後一天,那麼,結果將會調整以使返回值仍對應新的一月的最後一天。如果,結果月份的天數比開始月份的天數少,那麼,也會向回撥整以適應有效日期。
select add_months(sysdate,24) from dual; --加上兩年
select add_months(sysdate,-24) from dual; --減去兩年
select add_months(sysdate,3) from dual; --加上三個月
select add_months(to_date('2017-01-31','yyyy-mm-dd'),1) from dual; --由於一月的最後一天是31號,而加一個月,二月份只有28天,所以返回的結果是2017-2-28。
(5) 判斷某一日子所在年分是否為潤年
select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','閏年','平年') from dual;
(6) 當前時間減去七年
select sysdate,sysdate - interval '7' year from dual; --當前時間減去七年
ps:有很多類似的查詢如下:
select sysdate,sysdate - interval '7' MINUTE from dual; --當前時間減去7分鐘的時間
select sysdate - interval '7' hour from dual; --當前時間減去7小時的時間
select sysdate - interval ’7’ day from dual; --當前時間減去7天的時間
select sysdate - 7 from dual; --當前時間減去7天的時間,由於sysdate系統預設就是天數,所以可以不用函式,直接減去(7加不加引號都可)
select sysdate,sysdate - interval '7' month from dual; --當前時間減去7月的時間
(7)查詢日期之間的資料
例如查詢student表中出生日期(birthday)在’2016-01-01’ 和’2017-01-01’之間的資料:
select * from student where birthday between '2016-01-01' and '2017-01-01';
對於日期不規則的資料需要先轉格式,如下:
select * from student where to_date(student.birthday,'YYYY-MM-DD') between to_date('2016/01/01','YYYY-MM-DD') and to_date('2017/01/01','YYYY-MM-DD');
(8)查詢小於或者大於某日期的資料
例如查詢student表中出生日期(birthday)小於等於’2016-01-01’的資料:
select * from student where birthday <='2007-1-13';
對於日期不規則的資料需要先轉格式,如下:
select * from student where to_date(student.birthday,'YYYY-MM-DD') <= to_date('2016/01/01','YYYY-MM-DD');
(9)關於在xml檔案中大於和小於符號的處理
在mybatis的mapper.xml檔案中,由於xml檔案將大於小於符號識別為特殊符號,所以不允許出現類似“>”這樣的字元。這種情況下,需要使用轉義,用了轉義字元把>和<替換掉,就沒有問題了。
轉義列表:
< | < | 小於號 |
> | > | 大於號 |
& | & | 和 |
' | ' | 單引號 |
" | " | 雙引號 |
select * from student where 1 = 1 and birthday <= '2017-01-01' AND birthday >= '20160101'
對於xml中還有一種方式: <![CDATA[ SQL語句 ]]
因為這個是xml格式的,所以不允許出現類似“>”這樣的字元,但是都可以使用
select * from student where <![CDATA[ TO_DATE(student.birthday,'YYYY-MM-DD') < TO_DATE('20170101','YYYY-MM-DD') ]]>
(10)偽列dual
Dual 是 Oracle中的一個實際存在的表,任何使用者均可讀取,常用在沒有目標表的select語句塊中。比如,“select sysdate from dual”獲取系統當前時間。”select user from dual”則返回當前連線的使用者。如果是”select 1+2 from dual”,則返回結果3。