IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle timestamp

Oracle timestamp

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

  select systimestamp from dual

  select current_timestamp from dual

  select cast(sysdate as timestamp) "DATE" from dual

  select to_timestamp(to_date(sysdate, 'yyyy-mm-dd')) from dual

  select to_timestamp('2008-11-17 00:31:35', 'YYYY-MM-DD HH24:MI:SS:FF') from dual

  在ORACLE里面TIMESTAMP保存的格式是什么?insert into table(timestamp_field)values(sysdate)

  或

  insert into table(timestamp_field)values(to_timestamp(to_date('2007-11-1','yyyy-mm-dd'))

  保存后

  timestamp_field

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

  01-11月-07 12.00.00.000000 上午

  如果你想在ORACLE中存儲DATE和時間信息的話,實際上你由兩種字段數(shù)據(jù)類型的選擇的話,就讓我們看看這兩種數(shù)據(jù)類型的差別和它們提供了些什么。

  DATE數(shù)據(jù)類型

  這個數(shù)據(jù)類型我們實在是太熟悉了,當(dāng)我們需要表示日期和時間的話都會想到date類型。它可以存儲月,年,日,世紀,時,分和秒。它典型地用來表示什么時候事情已經(jīng)發(fā)生或?qū)⒁l(fā)生。DATE數(shù)據(jù)類型的問題在于它表示兩個事件發(fā)生時間間隔的度量粒度是秒。這個問題將在文章稍后討論timestamp的時候被解決。可以使用TO_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ù)。你需要明白的是,當(dāng)你進行兩個日期的相減運算的時候,得到的是天數(shù)。你需要乘上每天的秒數(shù)(1天=86400秒),然后,你可以再次計算得到你想要的間隔數(shù)。下面就是我的解決方法,可以精確計算出兩個時間的間隔。我明白這個例子可以更簡短些,但是我是為了顯示所有的數(shù)字來強調(diào)計算方式。

  1?? SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,

  2?? TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,

  3?? trunc(86400*(date2-date1))-

  4?? 60*(trunc((86400*(date2-date1))/60)) seconds,

  5?? trunc((86400*(date2-date1))/60)-

  6?? 60*(trunc(((86400*(date2-date1))/60)/60)) minutes,

  7?? trunc(((86400*(date2-date1))/60)/60)-

  8?? 24*(trunc((((86400*(date2-date1))/60)/60)/24)) hours,

  9?? trunc((((86400*(date2-date1))/60)/60)/24) days,

  10?? trunc(((((86400*(date2-date1))/60)/60)/24)/7) weeks

  11*? 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

  TIMESTAMP 數(shù)據(jù)類型

  DATE數(shù)據(jù)類型的主要問題是它粒度不能足夠區(qū)別出兩個事件哪個先發(fā)生。ORACLE已經(jīng)在DATE數(shù)據(jù)類型上擴展出來了TIMESTAMP數(shù)據(jù)類型,它包括了所有DATE數(shù)據(jù)類型的年月日時分秒的信息,而且包括了小數(shù)秒的信息。如果你想把DATE類型轉(zhuǎn)換成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

  正如你看到的,在轉(zhuǎn)換后的時間段尾部有了一段".000000"。這是因為從date轉(zhuǎn)換過來的時候,沒有小數(shù)秒的信息,缺省為0。而且顯示格式是按照參數(shù)NLS_TIMESTAMP_FORMAT定的缺省格式顯示。當(dāng)你把一個表中date類型字段的數(shù)據(jù)移到另一個表的timestamp類型字段中去的時候,可以直接寫INSERT SELECT語句,oracle會自動為你做轉(zhuǎn)換的。

  1 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)清楚表明了在當(dāng)兩個時間的差別極度重要的情況下,使用TIMESTAMP數(shù)據(jù)類型要比DATE數(shù)據(jù)類型更確切。

  如果你想顯示TIMESTAMP的小數(shù)秒信息,參考下面:

  1 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

  在上例中,我只現(xiàn)實了小數(shù)點后3位的內(nèi)容。

  計算timestamp間的數(shù)據(jù)差別要比老的date數(shù)據(jù)類型更容易。當(dāng)你直接相減的話,看看會發(fā)生什么。結(jié)果將更容易理解,第一行的17天,18小時,27分鐘和43秒。

  1 SELECT time1,

  2     time2,

  3     substr((time2-time1),instr((time2-time1),' ')+7,2)         seconds,

  4     substr((time2-time1),instr((time2-time1),' ')+4,2)         minutes,

  5     substr((time2-time1),instr((time2-time1),' ')+1,2)         hours,

  6     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' '))))  days,

  7     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' ')))/7) weeks

  8*  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

  這就意味著不再需要關(guān)心一天有多少秒在麻煩的計算中。因此,得到天數(shù)、月數(shù)、天數(shù)、時數(shù)、分鐘數(shù)和秒數(shù)就成為用substr函數(shù)摘取出數(shù)字的事情了。

  系統(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è)置初始化參數(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

  當(dāng)使用date和timestamp類型的時候,選擇是很清楚的。你可以隨意處置date和timestamp類型。當(dāng)你試圖轉(zhuǎn)換到更強大的timestamp的時候,需要注意,它們既有類似的地方,更有不同的地方,而足以造成破壞。兩者在簡潔和間隔尺寸方面各有優(yōu)勢,請合理地選擇。

關(guān)鍵詞標(biāo)簽:Oracle

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法