當前位置:學者齋 >

IT認證 >Oracle認證 >

Oracle認證:過去、現在及日期的差

Oracle認證:過去、現在及日期的差

  一、日期算法

Oracle認證:過去、現在及日期的差

1、sysdate、current_date及systimestamp

Oracle使用計算機操作系統的當前日期和時間,是通過sysdate函數實現的,在任何可以使用Oracle函數的其它地方都可以使用sysdate函數,可以將它視為每個表的一個隱藏列或者偽列。

select sysdate from dual;

結果:2013/12/22 19:14:21

current_date 返回的是當前會話的時區的系統日期,我們平時用的都是東八區,如果將當前會話時間修改成東九區試試:

alter session set time_zone='+09:00';

select current_date,sysdate from dual

結果:2013/12/24 20:27:332013/12/24 19:27:32

通過例子我們也看到它倆的區別了。

還有一個函數systimestapm,它返回的是本機的系統時間(包含微秒和時區),它跟會話的時區無關

select systimestamp from dual

結果:24-12月-13 000 下午 +08:00

2、兩個日期的差

兩個日期可以直接進行加減,返回的數值單位是天,也可以用一個日期加減某個數值代表N天后(前)

比如十天後發工資,那麼十天後是那一天呢?

select sysdate+10 from dual

結果:2014/1/1 19:38:19

再比如今天除夕是2014-01-30,那麼距離過年還有哪個多少天呢

select to_date('2014-01-30','yyyy-MM-dd') -sysdate from dual

結果:38.1794097222222

暈,還有一個多月才能過年呢啊

3、添加月份、減少月份

用的都是add_months

查詢一下三個月後、三個月前分別是哪一天:

select add_months(sysdate,3),add_months(sysdate,-3) from dual

結果:2014/3/22 19:47:182013/9/22 19:47:18

添加年份、減少年份就不用説了,直接在數值上乘以12就可以推算N年前、N年後是哪一天

4、greatest和least

這兩個函數在介紹數值函數的時候提到過,在數值函數中分別代表取一組數值中的最大值和最小值。

這哥倆在日期函數中也有應用,greatest是從一組日期數據中取距離當前最近的日期,least是在一組日期中選擇最早的日期。

select greatest(to_date('2013-11-11','yyyy-MM- dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM- dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual

結果:12013/1/5

select least(to_date('2013-11-11','yyyy-MM- dd'),to_date('2013-12-11','yyyy-MM-dd'),to_date('2014-01-05','yyyy-MM- dd'),to_date('2013-11-11','yyyy-MM-dd')) from dual

結果:12013/11/11

注意:這裏必須用to_date對字符串進行轉化,否則會把他們無法判斷是否為日期格式,只能當成字符串去處理。容易出現結果錯誤的情況。

5、next_day 代表從指定日期開始算,下週幾是哪一天

select next_day(to_date('2013-12-23','yyyy-MM-dd'),2) from dual

結果:2013/12/30

需要注意的是:這裏的2代表的是週一,而不是週二。 1234567 分別代表 週日、週一……週六。

6、last_day 計算某個月的最後一天是哪天?

select last_day(sysdate) from dual

結果:2013/12/31 20:46:07

7、months_between 計算兩個日期之間相差的月份數,返回結果可能帶小數

計算下自己的週歲:

select floor(months_between(sysdate ,to_date('1990-08-24','yyyy-MM-dd'))/12) from dual

結果:23

8、組合日期函數 : 多個日期函數組合使用

舉例:2013年10月28日入職新公司,倆月試用期,新員工過了試用期後的每月第一天可以做轉正報告。 那10月28日入職的什麼時候做轉正報告:

select last_day(add_months(to_date('2013-10-28','yyyy-MM-dd'),2))+1 from dual

結果:2014/1/1

思路:先用add_months計算倆月後是哪一天,再用last_day計算那個月的最後一天,再+1代表下個月的第一天。

  二、使用to_date 和 to_char設置日期時間格式

1、基本使用

to_date 和 to_char兩個函數的作用是相反的,但是用法很類似

to_date是將字符串轉換為時間格式 to_char是將日期轉換為字符串格式

這兩個函數我們平時用的實在是太多了,先寫倆例子吧,然後再説其他的:

select to_date('2013-11-11 12:01:14','yyyy-MM-dd HH:MI:SS') FROM DUAL

結果:2013/11/11 12:01:14

select to_char(sysdate , 'yyyy-MM-dd HH:MI:SS') from dual;

結果:2013-12-22 09:37:48

to_char的時候可以在format參數中插入字符串,以雙引號的方式插入:

select to_char(sysdate , 'yyyy"年"MM"月"dd"日"') from dual;

結果:2013年12月22日

2、最常見的to_char錯誤

就是MM代表的是月份 MI代表隊 是分鐘 不要弄混了,由於Oracle中支持的時間很靈活,所以這塊弄混了他不會提示你的。

select to_char(sysdate ,'yyyy-MI-dd hh:mm:ss') from dual

結果:2013-45-22 09:12:15

出現這樣的錯誤就很悲催了,好在分鐘是45還能容易發現, 要是1-12之內的,要從結果發現錯誤也不容易。

標籤: Oracle 日期
  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-mo/itrz/oracle/d96jj4.html