Oracle date 和 timestamp 區(qū)別詳解
Oracle date 和 timestamp 區(qū)別詳解
1.DATE數(shù)據(jù)類型
這個數(shù)據(jù)類型我們實在是太熟悉了,當我們需要表示日期和時間的話都會想到date類型。它可以存儲月,年,日,世紀,時,分和秒。它典型地用來表示什么時候事情已經(jīng)發(fā)生或?qū)⒁l(fā)生。
DATE數(shù)據(jù)類型的問題在于它表示兩個事件發(fā)生時間間隔的度量粒度是秒。這個問題將在稍后討論timestamp的時候被解決??梢允褂肨O_CHAR函數(shù)把DATE數(shù)據(jù)進行傳統(tǒng)地包裝,達到表示成多種格式的目的。
SQL> SELECT TO_CHAR(date1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table; Date --------------------------- 06/20/2003 16:55:14 06/26/2003 11:16:36
大多數(shù)人陷入的麻煩就是計算兩個時間間的間隔年數(shù)、月數(shù)、天數(shù)、小時數(shù)和秒數(shù)。你需要明白的是,當你進行兩個日期的相減運算的時候,得到的是天數(shù)。你需要乘上每天的秒數(shù)(1天=86400秒),然后,你可以再次計算得到你想要的間隔數(shù)。下面就是我的解決方法,可以精確計算出兩個時間的間隔。我明白這個例子可以更簡短些,但是我是為了顯示所有的數(shù)字來強調(diào)計算方式。
SELECT TO_CHAR(date1, 'MMDDYYYY:HH24:MI:SS') date1, TO_CHAR(date2, 'MMDDYYYY:HH24:MI:SS') date2, trunc(86400 * (date2 - date1)) - 60 * (trunc((86400 * (date2 - date1)) / 60)) seconds, trunc((86400 * (date2 - date1)) / 60) - 60 * (trunc(((86400 * (date2 - date1)) / 60) / 60)) minutes, trunc(((86400 * (date2 - date1)) / 60) / 60) - 24 * (trunc((((86400 * (date2 - date1)) / 60) / 60) / 24)) hours, trunc((((86400 * (date2 - date1)) / 60) / 60) / 24) days, trunc(((((86400 * (date2 - date1)) / 60) / 60) / 24) / 7) weeks FROM date_table DATE1 DATE2 SECONDS MINUTES HOURS DAYS WEEKS ----------------- ----------------- ---------- ---------- ---------- ---------- ---------- 06202003:16:55:14 07082003:11:22:57 43 27 18 17 2 06262003:11:16:36 07082003:11:22:57 21 6 0 12 1
2.TIMESTAMP 數(shù)據(jù)類型
DATE數(shù)據(jù)類型的主要問題是它粒度不能足夠區(qū)別出兩個事件哪個先發(fā)生。ORACLE已經(jīng)在DATE數(shù)據(jù)類型上擴展出來了TIMESTAMP數(shù)據(jù)類型,它包括了所有DATE數(shù)據(jù)類型的年月日時分秒的信息,而且包括了小數(shù)秒的信息。如果你想把 DATE類型轉換成TIMESTAMP類型,就使用CAST函數(shù)。
SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t; Date ----------------------------------------------------- 20-JUN-03 04.55.14.000000 PM 26-JUN-03 11.16.36.000000 AM
正如你看到的,在轉換后的時間段尾部有了一段“.000000”。這是因為從date轉換過來的時候,沒有小數(shù)秒的信息,缺省為0。而且顯示格式是按照參數(shù)NLS_TIMESTAMP_FORMAT定的缺省格式顯示。當你把一個表中date類型字段的數(shù)據(jù)移到另一個表的timestamp類型字段中去的時候,可以直接寫INSERT SELECT語句,oracle會自動為你做轉換的。
SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table Date ------------------- 06/20/2003 16:55:14 06/26/2003 11:16:36
TIMESTAMP數(shù)據(jù)的格式化顯示和DATE 數(shù)據(jù)一樣。注意,to_char函數(shù)支持date和timestamp,但是trunc卻不支持TIMESTAMP數(shù)據(jù)類型。這已經(jīng)清楚表明了在當兩個時間的差別極度重要的情況下,使用TIMESTAMP數(shù)據(jù)類型要比DATE數(shù)據(jù)類型更確切。
SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS:FF3') "Date" FROM date_table Date ----------------------- 06/20/2003 16:55:14:000 06/26/2003 11:16:36:000
計算timestamp間的數(shù)據(jù)差別要比老的date數(shù)據(jù)類型更容易。當你直接相減的話,看看會發(fā)生什么。結果將更容易理解,第一行的17天,18小時,27分鐘和43秒。
SELECT time1, time2, substr((time2 - time1), instr((time2 - time1), ' ') + 7, 2) seconds, substr((time2 - time1), instr((time2 - time1), ' ') + 4, 2) minutes, substr((time2 - time1), instr((time2 - time1), ' ') + 1, 2) hours, trunc(to_number(substr((time2 - time1), 1, instr(time2 - time1, ' ')))) days, trunc(to_number(substr((time2 - time1), 1, instr(time2 - time1, ' '))) / 7) weeks FROM date_table TIME1 TIME2 SECONDS MINUTES HOURS DAYS WEEKS ------------------------- -------------------------- ------- ------- ----- ---- ----- 06/20/2003:16:55:14:000000 07/08/2003:11:22:57:000000 43 27 18 17 2 06/26/2003:11:16:36:000000 07/08/2003:11:22:57:000000 21 06 00 12 1
這就意味著不再需要關心一天有多少秒在麻煩的計算中。因此,得到天數(shù)、月數(shù)、天數(shù)、時數(shù)、分鐘數(shù)和秒數(shù)就成為用substr函數(shù)摘取出數(shù)字的事情了。
3.系統(tǒng)日期和時間
為了得到系統(tǒng)時間,返回成date數(shù)據(jù)類型。你可以使用sysdate函數(shù)。
SQL> SELECT SYSDATE FROM DUAL;
為了得到系統(tǒng)時間,返回成timestamp數(shù)據(jù)類型。你可以使用systimpstamp函數(shù)。
SQL> SELECT SYSTIMESTAMP FROM DUAL;
你可以設置初始化參數(shù)FIXED_DATE指定sysdate函數(shù)返回一個固定值。這用在測試日期和時間敏感的代碼。注意,這個參數(shù)對于systimestamp函數(shù)無效。
SQL> ALTER SYSTEM SET fixed_date = '2003-01-01-10:00:00'; System altered. SQL> select sysdate from dual; SYSDATE --------- 01-JAN-03 SQL> select systimestamp from dual; SYSTIMESTAMP --------------------------------------------------------- 09-JUL-03 11.05.02.519000 AM -06:00
4.date和timestamp 的區(qū)別
date類型是Oracle常用的日期型變量,他的時間間隔是秒。兩個日期型相減得到是兩個時間的間隔,注意單位是“天”。例如:查看一下當前距離倫敦奧運會開幕還有多長時間:
select to_date('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-sysdate from dual
結果是:92.2472685185185天,然后你根據(jù)相應的時間換算你想要的間隔就行!這個結果可能對程序員有用,對于想直接看到結果的人,這個數(shù)字還不是很直觀,所以,就引出了timestamp類型
timestamp是DATE類型的擴展,可以精確到小數(shù)秒(fractional_seconds_precision),可以是0 to9,缺省是6。兩個timestamp相減的話,不能直接的得到天數(shù)書,而是得到,
多少天,多少小時,多少秒等,例如:同樣查看一下當前距離倫敦奧運會開幕還有多長時間.
select to_timestamp('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-systimestamp from dual
結果是:+000000092 05:51:24.032000000,稍加截取,就可以得到92天5小時,51分鐘,24秒,這樣用戶看起來比較直觀一些!但是這個數(shù)字對程序員來說不是很直觀了,如果想要具體的時間長度的話,并且精度不要求到毫秒的話,可以將timestamp類型轉成date類型,然后直接相減即可。
5.date和timestamp之間的相互轉換可以通過
to_char來轉換timestamp——>date:
select to_date(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual
date ——>timestamp:
select to_timestamp(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual
當使用date和timestamp類型的時候,選擇是很清楚的。你可以隨意處置date和timestamp類型。當你試圖轉換到更強大的timestamp的時候,需要注意,它們既有類似的地方,更有不同的地方,而足以造成破壞。兩者在簡潔和間隔尺寸方面各有優(yōu)勢,請合理地選擇。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Oracle Database 10g數(shù)據(jù)庫安裝及配置教程
這篇文章主要介紹了Oracle Database 10g Release 2數(shù)據(jù)庫安裝及配置教程,感興趣的小伙伴們可以參考一下2016-08-08oracle中all、any函數(shù)用法與區(qū)別說明
在Oracle中,any()表示括號內(nèi)任何一個條件,只要有一個滿足即可;而all()表示所有的條件都滿足才可以2023-04-04Oracle數(shù)倉中判斷時間連續(xù)性的幾種SQL寫法示例
這篇文章主要給大家介紹了關于Oracle數(shù)倉中判斷時間連續(xù)性的幾種SQL寫法,文中通過實例代碼介紹的非常詳細,對大家學習或者使用Oracle具有一定的參考學習價值,需要的朋友可以參考下2023-02-02oracle查詢重復數(shù)據(jù)和刪除重復記錄示例分享
oracle查詢重復數(shù)據(jù)和刪除重復記錄示例分享,大家參考使用吧2013-12-12oracle中行轉列LISTAGG()函數(shù)詳解及應用實例
這篇文章主要給大家介紹了關于oracle中行轉列LISTAGG()函數(shù)詳解及應用實例的相關資料,stagg是oracle11.2增加的特性,功能類似wmsys.wm_concat函數(shù),即將數(shù)據(jù)分組后,把指定列的數(shù)據(jù)通過指定符號合并,需要的朋友可以參考下2024-05-05Oracle7.X 回滾表空間數(shù)據(jù)文件誤刪除處理方法
Oracle7.X 回滾表空間數(shù)據(jù)文件誤刪除處理方法...2007-03-03