oracle中date和timestamp的區別

2021-09-01 21:31:04 字數 4227 閱讀 5202

**

如果你想在oracle中儲存date和時間資訊的話,實際上你由兩種字段資料型別的選擇的話,就讓我們看看這兩種資料型別的差別和它們提供了些什麼。

date資料型別

這個資料型別我們實在是太熟悉了,當我們需要表示日期和時間的話都會想到date型別。它可以儲存月, 年,日,世紀,時,分和秒。它典型地用來表示什麼時候事情已經發生或將要發生。date資料型別的問題在於它表示兩個事件發生時間間隔的度量粒度是秒。這 個問題將在文章稍後討論timestamp的時候被解決。可以使用to_char函式把date資料進行傳統地包裝,達到表示成多種格式的目的。

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

我見到的大多數人陷入的麻煩就是計算兩個時間間的間隔年數、月數、天數、小時數和秒數。你需要明白的是,當你進行兩個日期的相減運算的時候,得 到的是天數。你需要乘上每天的秒數(1天=86400秒),然後,你可以再次計算得到你想要的間隔數。下面就是我的解決方法,可以精確計算出兩個時間的間 隔。我明白這個例子可以更簡短些,但是我是為了顯示所有的數字來強調計算方式。

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 資料型別

date資料型別的主要問題是它粒度不能足夠區別出兩個事件哪個先發生。oracle已經在date資料型別上擴充套件出來了timestamp數 據型別,它包括了所有date資料型別的年月日時分秒的資訊,而且包括了小數秒的資訊。如果你想把date型別轉換成timestamp型別,就使用 cast函式。

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轉換過來的時候,沒有小數秒的資訊,預設為0。而且顯示格 式是按照引數nls_timestamp_format定的預設格式顯示。當你把乙個表中date型別欄位的資料移到另乙個表的timestamp型別字 段中去的時候,可以直接寫insert select語句,oracle會自動為你做轉換的。

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資料的格式化顯示和date 資料一樣。注意,to_char函式支援date和timestamp,但是trunc卻不支援timestamp資料型別。這已經清楚表明了在當兩個時 間的差別極度重要的情況下,使用timestamp資料型別要比date資料型別更確切。

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

在上例中,我只現實了小數點後3位的內容。

計算timestamp間的資料差別要比老的date資料型別更容易。當你直接相減的話,看看會發生什麼。結果將更容易理解,第一行的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

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

系統日期和時間

為了得到系統時間,返回成date資料型別。你可以使用sysdate函式。

sql> select sysdate from dual;

為了得到系統時間,返回成timestamp資料型別。你可以使用systimpstamp函式。

sql> select systimestamp from dual;

你可以設定初始化引數fixed_date指定sysdate函式返回乙個固定值。這用在測試日期和時間敏感的**。注意,這個引數對於systimestamp函式無效。

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

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

Oracle中插入Date資料

oracle中插入date資料 錯誤的 insert into table j values 2000 11 26 00 04 47 在oracle中建有date型別的字段,插入可以採取如下方法 如果是小時為 12 採取如下格式 yyyy mm dd hh mi ss insert into tes...

Oracle中date與timestamp的異同

在oracle中儲存date和時間資訊的話,實際上你有兩種字段資料型別的選擇 9i date資料型別 可以儲存月,年,日,世紀,時,分和秒。度量粒度是秒 以使用to char函式把date資料進行傳統地包裝,達到表示成多種格式的目的 select to char sysdate,mm dd yyyy...

Oracle中的date與timestamp的區別

在oracle中儲存date和時間資訊的話,實際上你有兩種字段資料型別的選擇 9i date資料型別 可以儲存月,年,日,世紀,時,分和秒。度量粒度是秒 以使用to char函式把date資料進行傳統地包裝,達到表示成多種格式的目的 select to char sysdate,mm dd yyyy...