天天看點

3.常用的ORACLE函數【日期函數】 .

一些ORACLE常用函數【日期函數】

【add_months,last_day,months_between,new_time,next_day,round,sysdate,trunc】

<1>ADD_MONTHS

文法:  ADD_MONTHS(d,x)

功能:  傳回日期d加上x個月後的月份。x可以是任意整數。

如果結果日期中的月份所包含的天數比d日期中的“日”分量要少。

(即相加後的結果日期中的日分量資訊已經超過該月的最後一天,

例如,8月31日加上一個月之後得到9月31日,而9月隻能有30天)傳回結果月份的最後一天。

使用位置: 過程性語言和SQL語句。

ADD_MONTHS 增加或減去月份

SQL> select to_char(add_months(to_date('201209','yyyymm'),2),'yyyymm') 加月份,

to_char(add_months(to_date('201209','yyyymm'),-2),'yyyymm') 減月份 from dual;

加月份    減月份

------    -------

201211    201207

<2>LAST_DAY

文法: LAST_DAY(d)

功能: 計算包含日期的d的月份最後一天的日期.這個函數可以用來計算當月中剩餘天數.

使用位置: 過程性語言和SQL語句。

LAST_DAY:傳回日期的最後一天

SQL> select to_char(sysdate,'yyyy.mm.dd') 目前日期,

to_char((sysdate)+1,'yyyy.mm.dd') 目前日期加減 from dual;

目前日期     目前日期加減

----------   ----------

2012.09.17   2012.09.18

SQL> select last_day(sysdate) 本月最後一天 from dual;

本月最後一天

------------------

2012/9/30 14:57:56

<3>MONTHS_BETWEEN

文法:  MONTHS_BETWEEN(date 1,date2)

功能:  計算date 1和date2之間月數.如果date 1,date2這兩個日期中日分量資訊是相同的,或者這兩個日期都分别是所在月的最後一天,那麼傳回的結果是一個整數,否則包括一個小數,小數為富餘天數除以31.

使用位置: 過程性語言和SQL語句。

MONTHS_BETWEEN(date2,date1): 給出date2-date1的月份

SQL>select months_between(to_date('2012/05/20','yyyy/mm/dd'),

to_date('2005/09/10','yyyy/mm/dd')) mon_betw from dual;

MON_BETW

---------

80.3225806451613

<4>NEW_TIME

文法:  NEW_TIME(d,zone1,zone2)

功能: 計算當時區zone1中的日期和時間是s時候,傳回時區zone2中的日期和時間. zone1和zone2是字元串.

使用位置: 過程性語言和SQL語句。

NEW_TIME(date,'this','that'):給出在this時區=other時區的日期和時間

NEW_TIME   (d,'tz1','tz2')

d::一個有效的日期型變量

tz1   &   tz2::下表中的任一時區

時區1   時區2       說明

AST       ADT           大西洋标準時間

BST       BDT           白令海标準時間

CST       CDT           中部标準時間

EST       EDT           東部标準時間

GMT                     格林尼治标準時間

HST       HDT           阿拉斯加—夏威夷标準時間

MST       MDT           山區标準時間

NST                     紐芬蘭标準時間

PST       PDT           太平洋标準時間

YST       YDT           YUKON标準時間

SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') bj_time,to_char(new_time

(sysdate,'PDT','GMT'),'yyyy/mm/dd hh24:mi:ss') los_angles from dual;

BJ_TIME             LOS_ANGLES

------------------- -------------------

2004.05.09 11:05:32 2004.05.09 18:05:32

<5>NEXT_DAY

文法:  NEXT_DAY(d,string)

功能:  計算在日期d後滿足由string給出的條件的第一天.String使用位置;目前會話的語言指定了一周中的某一天.

傳回值的時間分量與d的時間分量是相同的. String的内容可以忽略大小寫.

使用位置: 過程性語言和SQL語句。

NEXT_DAY(date,'day'):給出日期date和星期x之後計算下一個星期的日期

SQL> select next_day('17-9月-2012','星期六') next_day from dual;

NEXT_DAY

----------

2012/9/22

<6>ROUND

文法:  ROUND(d[,format])

功能:  将日期d按照由format指定的格式進行處理.如果沒有給format則使用預設設定'DD'.

使用位置: 過程性語言和SQL語句。

<7>SYSDATE

文法: SYSDATE

功能: 取得目前的日期和時間,類型是DATE.它沒有參數.

但在分布式SQL語句中使用時,SYSDATE傳回本地資料庫的日期和時間.

使用位置: 過程性語言和SQL語句。

SYSDATE 用來得到系統的目前日期

SQL> select to_char(sysdate,'dd/mm/yyyy day') 系統日期 from dual;

系統日期

-----------------

17/09/2012 星期一

<8>TRUNC

文法:  TRUNC(d,format)

功能:  計算截尾到由format指定機關的日期d.可以使用位置:格式和效果.預設參數同ROUNG.

使用位置: 過程性語言和SQL語句。

trunc(date,fmt)按照給出的要求将日期截斷,如果fmt='mi'表示保留分,截斷秒

SQL> select to_char(trunc(sysdate,'hh'),'yyyy/mm/dd hh24:mi:ss') HH,

to_char(trunc(sysdate,'mi'),'yyyy/mm/dd hh24:mi:ss') HHMM,

to_char(trunc(sysdate,'dd'),'yyyy/mm/dd hh24:mi:ss') DD,

to_char(trunc(sysdate,'mm'),'yyyy/mm/dd hh24:mi:ss') MM  from dual;

HH                    HHMM                DD                    MM

-------------------  -------------------  -------------------  -------------------

2012/09/17 14:00:00  2012/09/17 14:56:00  2012/09/17 00:00:00  2012/09/01 00:00:00

<9>其他常用:擷取系統目前月的第一天和最後一天

select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天",

to_char(last_day(sysdate), 'yyyy-mm-dd') "本月最後一天" from dual;

-------

2012-09-01 2012-09-30

select trunc(add_months(last_day(sysdate), -1) + 1) AS 系統當月第一天,

last_day(sysdate)AS 系統當月最後一天 from dual;

-----------------

2012/9/1 2012/9/30 15:06:01

select to_char(sysdate,'yyyy/mm')||'/01' firstday,

to_char(last_day(sysdate),'yyyy/mm/dd') lastday from dual;

select Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,

       Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,

       Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,

       LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month

from dual

-----------------------------------

2012/8/1 2012/8/31 23:59:59 2012/9/1 2012/9/30 23:59:59

==============================================================

常用日期資料格式(該段為摘抄)  

Y或YY或YYY 年的最後一位,兩位或三位

Select to_char(sysdate,'YYY') from dual; 002表示2002年  

SYEAR或YEAR SYEAR使公元前的年份前加一負号

Select to_char(sysdate,'SYEAR') from dual; -1112表示公元前111 2年  

Q 季度,1~3月為第一季度

Select to_char(sysdate,'Q') from dual; 2表示第二季度①  

MM 月份數

Select to_char(sysdate,'MM') from dual; 12表示12月  

RM 月份的羅馬表示

Select to_char(sysdate,'RM') from dual; IV表示4月  

Month 用9個字元長度表示的月份名

Select to_char(sysdate,'Month') from dual; May後跟6個空格表示5月  

WW 當年第幾周

Select to_char(sysdate,'WW') from dual; 24表示2002年6月13日為第24周  

W 本月第幾周

Select to_char(sysdate,'W') from dual; 2002年10月1日為第1周  

DDD 當年第幾, 1月1日為001,2月1日為032

Select to_char(sysdate,'DDD') from dual; 363 2002年1 2月2 9日為第363天  

DD 當月第幾天

Select to_char(sysdate,'DD') from dual; 04 10月4日為第4天  

D 周内第幾天

Select to_char(sysdate,'D') from dual; 5 2002年3月14日為星期一  

DY 周内第幾天縮寫

Select to_char(sysdate,'DY') from dual; SUN 2002年3月24日為星期天  

HH或HH12 12進制小時數

Select to_char(sysdate,'HH') from dual; 02 午夜2點過8分為02  

HH24 24小時制

Select to_char(sysdate,'HH24') from dual; 14 下午2點08分為14  

MI 分鐘數(0~59)

Select to_char(sysdate,'MI') from dual; 17下午4點17分  

SS 秒數(0~59)

Select to_char(sysdate,'SS') from dual; 22 11點3分22秒  

提示注意不要将MM格式用于分鐘(分鐘應該使用MI)。

MM是用于月份的格式,将它用于分鐘也能工作,但結果是錯誤的。

==============================================================

Oracle時間日期操作

sysdate+(5/24/60/60) 在系統時間基礎上延遲5秒

sysdate+5/24/60 在系統時間基礎上延遲5分鐘

sysdate+5/24 在系統時間基礎上延遲5小時

sysdate+5 在系統時間基礎上延遲5天

add_months(sysdate,-5) 在系統時間基礎上延遲5月

add_months(sysdate,-5*12) 在系統時間基礎上延遲5年

--加1年 

select sysdate,add_months(sysdate,12) from dual; 

--加1月

select sysdate,add_months(sysdate,1) from dual;  

--加1星期

select sysdate,TO_CHAR(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1天

select sysdate,TO_CHAR(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1小時

select sysdate,TO_CHAR(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  

--加1分鐘

select sysdate,TO_CHAR(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1秒

select sysdate,TO_CHAR(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;                   

--加7天

select sysdate+7   from   dual; 

--上月末的日期:

select last_day(add_months(sysdate, -1)) from dual;

--本月的最後一秒:

select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual;

--本周星期一的日期:

select trunc(sysdate,'day')+1 from dual;

--年初至今的天數:

select ceil(sysdate - trunc(sysdate, 'year')),

trunc(sysdate, 'year') from dual;

--今天是今年的第幾周 :

select to_char(sysdate,'fmww') from dual;

--今天是本月的第幾周:

SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual;

--本月的天數

SELECT to_char(last_day(SYSDATE),'dd') days FROM dual

--今年的天數

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

--下個星期一的日期

SELECT Next_day(SYSDATE,'星期一') FROM dual

--判斷目前時間是上午下午還是晚上

SELECT CASE

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN '上午'

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN '下午'

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN '晚上'

END

FROM dual;

----計算小時,分,秒,毫秒

select Days, A,

TRUNC(A*24) Hours,

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

from

( select trunc(sysdate) Days, sysdate - trunc(sysdate) A

from dual )

--------------------------

2012/9/17 0.644305555555556 15 27 48 0

**************************************************************************************************************************************

3.常用的ORACLE函數【日期函數】 .
3.常用的ORACLE函數【日期函數】 .

==== Till good is better, but better best

3.常用的ORACLE函數【日期函數】 .
3.常用的ORACLE函數【日期函數】 .

====“我的努力不會停止,敬請期待吧!”My trying hard will go on!Please wait and see!

**************************************************************************************************************************************