oracle資料型別之DATETIME
Datetime and Interval
在007題庫中有一道關於DATETIME資料型別的題目:
Which three are DATETIME data types that can be used when specifying column definitions? (Choose three)
A. TIMESTAMP
B. INTERVAL MONTH TO DAY
C. INTERVAL DAY TO SECOND
D. INTERVAL YEAR TO MONTH
E. TIMESTAMP WITH DATABASE TIMEZONE
這道題,因為要選三個答案,因此應該就是A, C, D。 不過在Oracle9i Reference中,好像並沒有把INTERVAL歸到datetime datatypes 裡面, 原文是如此描述的:
The datetime datatypes are DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE. Values of datetime datatypes are sometimes called "datetimes". The interval datatypes are INTERVAL YEAR TO MONTH and INTERVAL DAY TO SECOND. Values
of interval datatypes are sometimes called intervals.
因此如果上面的題目中沒有指定選擇三個,那很有可能就做錯了。
DATE資料型別在工作中用的最多,一般就是包含年月日時分秒。不過以前從來沒用過日期常量,格式為DATE'2009-07-28', 不能包含時間部分,且必須是'YYYY-MM-DD'格式,如果要包含時間部分,只能用to_date來轉化了。
timestamp和interval這兩個資料型別在工作中用的很少。
timestamp和date差不多,只是後面多了秒以下的部分,可以用0-9位的小數來表示其精度(fractional_seconds_precision)。不過還有個區別是timestamp後面可以加上WITH TIME ZONE 或者 WITH LOCAL TIME ZONE。其中WITH TIME ZONE表示該資料型別中還包含了和UTC之間的時區偏移資訊;而WITH LOCAL TIME ZONE的資料型別中,儲存時都是標準化成資料庫的時區,當用戶獲取資料時,oracle會根據使用者本地session中的時區資訊來計算和UTC的時區偏移。
interval印象裡在8i沒見過,可能是借鑑informix裡面的interval資料型別,不過oracle9i只有兩種interval型別:interval year to month和interval day to second,比informix裡面簡單多了,其中year後可以加一個精度控制,比如 interval year(1) to month,那麼年部分最多就是1位數,該值預設為2;day部分也一樣,如inetrval day(3) to second, 表示日部分最多3位數,該值預設也為2;second後面還可以加上秒以下的時間精度,如inetrval
day(3) to second(3),表示秒以下部分用3位小數表示。 注意這個second後面的數字容易理解為是秒的精度,實際上是秒以下部分的精度。
interval的常量表示類似如下方式:
interval '3-1' year to month, 表示3年零1個月, 也相當於interval '37' month,即37個月
interval '2 1:0:0' day to second,表示2天1小時。
interval '999 00:01:00.123' day(3) to second (3)
interval資料型別可以和date,timstamp型別進行加減運算,兩個相同的interval型別也可以加減運算,但是interval year to month和interval day to second不能進行運算。