1. 程式人生 > >Oracle時間日期函式及sql語句

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檔案將大於小於符號識別為特殊符號,所以不允許出現類似“>”這樣的字元。這種情況下,需要使用轉義,用了轉義字元把>和<替換掉,就沒有問題了。 

轉義列表: 

&lt; < 小於號
&gt; > 大於號
&amp; &
&apos; ' 單引號
&quot; " 雙引號
select * from student where 1 = 1 and birthday  &lt;= '2017-01-01' AND birthday &gt;= '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。