Oracle 資料型別timestamp和date

2021-06-20 03:37:18 字數 4655 閱讀 1330

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和時間資訊的話,實際上你由兩種字段資料型別的選擇的話,就讓我們看看這兩種資料型別的差別和它們提供了些什麼。

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

char 用於描述定長的字元型資料,長度 2000位元組 varchar2 用於描述變長的字元型資料,長度 4000位元組 nchar 用來儲存unicode字符集的定長字元型資料,長度 1000位元組 nvarchar2 用來儲存unicode字符集的變長字元型資料,長度 1000位元組 numb...

Oracle資料型別

一 概述 標量 scalar 復合 composite 引用 reference lob 二 標量 scalar 合法的標量型別與資料庫的列所使用的型別相同,此外它還有一些擴充套件。它又分為七個組 數字 字元 行 日期 行標識 布林和可信。數字,它有三種基本型別 number pls integer...

Oracle 資料型別

資料型別 引數描述 char n n 1 to 2000位元組 定長字串,n位元組長,如果不指定長度,預設為1個位元組長 乙個漢字為2位元組 varchar2 n n 1 to 4000位元組 可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字 字母以及ascii碼字符集 或者ebcdi...