- 相關(guān)推薦
Oracle認證:過(guò)去、現在及日期的差
一、日期算法
1、sysdate、current_date及systimestamp
Oracle使用計算機操作系統的當前日期和時(shí)間,是通過(guò)sysdate函數實(shí)現的,在任何可以使用Oracle函數的其它地方都可以使用sysdate函數,可以將它視為每個(gè)表的一個(gè)隱藏列或者偽列。
select sysdate from dual;
結果:2013/12/22 19:14:21
current_date 返回的是當前會(huì )話(huà)的時(shí)區的系統日期,我們平時(shí)用的都是東八區,如果將當前會(huì )話(huà)時(shí)間修改成東九區試試:
alter session set time_zone='+09:00';
select current_date,sysdate from dual
結果:2013/12/24 20:27:332013/12/24 19:27:32
通過(guò)例子我們也看到它倆的區別了。
還有一個(gè)函數systimestapm,它返回的是本機的系統時(shí)間(包含微秒和時(shí)區),它跟會(huì )話(huà)的時(shí)區無(wú)關(guān)
select systimestamp from dual
結果:24-12月-13 07.34.37.042000 下午 +08:00
2、兩個(gè)日期的差
兩個(gè)日期可以直接進(jìn)行加減,返回的數值單位是天,也可以用一個(gè)日期加減某個(gè)數值代表N天后(前)
比如十天后發(fā)工資,那么十天后是那一天呢?
select sysdate+10 from dual
結果:2014/1/1 19:38:19
再比如今天除夕是2014-01-30,那么距離過(guò)年還有哪個(gè)多少天呢
select to_date('2014-01-30','yyyy-MM-dd') -sysdate from dual
結果:38.1794097222222
暈,還有一個(gè)多月才能過(guò)年呢啊
3、添加月份、減少月份
用的都是add_months
查詢(xún)一下三個(gè)月后、三個(gè)月前分別是哪一天:
select add_months(sysdate,3),add_months(sysdate,-3) from dual
結果:2014/3/22 19:47:182013/9/22 19:47:18
添加年份、減少年份就不用說(shuō)了,直接在數值上乘以12就可以推算N年前、N年后是哪一天
4、greatest和least
這兩個(gè)函數在介紹數值函數的時(shí)候提到過(guò),在數值函數中分別代表取一組數值中的最大值和最小值。
這哥倆在日期函數中也有應用,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對字符串進(jìn)行轉化,否則會(huì )把他們無(wú)法判斷是否為日期格式,只能當成字符串去處理。容易出現結果錯誤的情況。
5、next_day 代表從指定日期開(kāi)始算,下周幾是哪一天
select next_day(to_date('2013-12-23','yyyy-MM-dd'),2) from dual
結果:2013/12/30
需要注意的是:這里的2代表的是周一,而不是周二。 1234567 分別代表 周日、周一……周六。
6、last_day 計算某個(gè)月的最后一天是哪天?
select last_day(sysdate) from dual
結果:2013/12/31 20:46:07
7、months_between 計算兩個(gè)日期之間相差的月份數,返回結果可能帶小數
計算下自己的周歲:
select floor(months_between(sysdate ,to_date('1990-08-24','yyyy-MM-dd'))/12) from dual
結果:23
8、組合日期函數 : 多個(gè)日期函數組合使用
舉例:2013年10月28日入職新公司,倆月試用期,新員工過(guò)了試用期后的每月第一天可以做轉正報告。 那10月28日入職的什么時(shí)候做轉正報告:
select last_day(add_months(to_date('2013-10-28','yyyy-MM-dd'),2))+1 from dual
結果:2014/1/1
思路:先用add_months計算倆月后是哪一天,再用last_day計算那個(gè)月的最后一天,再+1代表下個(gè)月的第一天。
二、使用to_date 和 to_char設置日期時(shí)間格式
1、基本使用
to_date 和 to_char兩個(gè)函數的作用是相反的,但是用法很類(lèi)似
to_date是將字符串轉換為時(shí)間格式 to_char是將日期轉換為字符串格式
這兩個(gè)函數我們平時(shí)用的實(shí)在是太多了,先寫(xiě)倆例子吧,然后再說(shuō)其他的:
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的時(shí)候可以在format參數中插入字符串,以雙引號的方式插入:
select to_char(sysdate , 'yyyy"年"MM"月"dd"日"') from dual;
結果:2013年12月22日
2、最常見(jiàn)的to_char錯誤
就是MM代表的是月份 MI代表隊 是分鐘 不要弄混了,由于Oracle中支持的時(shí)間很靈活,所以這塊弄混了他不會(huì )提示你的。
select to_char(sysdate ,'yyyy-MI-dd hh:mm:ss') from dual
結果:2013-45-22 09:12:15
出現這樣的錯誤就很悲催了,好在分鐘是45還能容易發(fā)現, 要是1-12之內的,要從結果發(fā)現錯誤也不容易。
3、to_date 不僅可以接受字符串的參數,還可以接受數值類(lèi)型的參數:
select to_date(20131222,'yyyy-MM-dd') from dual
結果:2013/12/22
4、new_time 切換時(shí)區
new_time(date,'this','other')
三個(gè)參數:date代表的是this時(shí)區的時(shí)間,'this'代表的是是用三個(gè)字母組成的縮寫(xiě)代替,代表當前時(shí)區,'other'也是用三個(gè)字母組成的縮寫(xiě)代替,表示其他時(shí)區。
舉例:查一下'2014-10-01 12:00:00'這個(gè)時(shí)間在北京和夏威夷的時(shí)間分別是多少
select to_date('2014-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),new_time(to_date('2014-10-01 12:00:00','yyyy-MM-dd hh24:mi:ss'),'EST','HST') FROM DUAL
結果:2014/10/1 12:00:002014/10/1 7:00:00
應該不會(huì )常用,了解下就行了。
三、EXTRACT
EXTRACT可用來(lái)代替to_char函數來(lái)選擇日期值中的某一部分(如從一個(gè)日期中選擇月份和天)
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL;
結果:
2013
12
22
注意:EXTRACT抽取年月日部分和抽取時(shí)分部分是不同的,抽取時(shí)分的時(shí)候
SELECT EXTRACT(hour FROM TIMESTAMP '2013-12-22 22:34:12') FROM DUAL;
SELECT EXTRACT(minute FROM TIMESTAMP '2013-12-22 22:34:12') FROM DUAL;
結果:
22
34
而且如果將'2013-12-22 22:34:12'用to_date轉換成日期格式還報錯,真讓我想不通
再說(shuō)了這個(gè)函數的存在有毛用呢?至今沒(méi)想明白,用to_char完全可以實(shí)現它的功能啊
select to_char(sysdate ,'yyyy') from dual;
select to_char(sysdate ,'HH') from dual
結果:2013
10
四、使用TIMESTAMP類(lèi)型
DATE 在數據類(lèi)型存儲精確到秒的日期和時(shí)間,二TIMESTAMP數據類(lèi)型存儲精確到十億分之一秒的日期。
【Oracle認證:過(guò)去、現在及日期的差】相關(guān)文章:
Oracle認證作用03-19
Oracle認證簡(jiǎn)介11-30
Oracle最新認證03-09
Oracle認證途徑03-20
Oracle認證:ORACLE綁定變量BINDPEEKING03-08
Oracle認證職業(yè)前景03-19
Oracle認證考試技巧03-19
oracle認證考試詳情01-22