Oracle時間タイプ要約

17675 ワード

1.DATEデータ型


このデータ型はよく知っていますが、日付と時間を表す必要がある場合はdateタイプを思い浮かべます.月、年、日、世紀、時、分、秒を格納することができます.それは典型的に、いつ事件が発生したか、または発生するかを表すために使用されます.DATEデータ型の問題は、2つのイベントの発生時間間隔を表すメトリック粒度が秒であることである.この問題は後でtimestampについて議論する際に解決される.TO_を使用可能CHAR関数はDATEデータを従来のようにパッケージし,多様な形式で表す目的を達成する.
1 SQL> SELECT TO_CHAR(date1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table;
2 
3 Date 
4 --------------------------- 
5 06/20/2003 16:55:14 
6 06/26/2003 11:16:36

多くの人が抱えるトラブルは、2つの時間の間隔の年数、月数、日数、時間数、秒数を計算することです.2つの日付の減算を行うと、日数が得られることを理解する必要があります.毎日の秒数(1日=86400秒)に乗る必要があります.そして、もう一度希望の間隔数を計算することができます.次は私の解決方法で、2つの時間の間隔を正確に計算することができます.私はこの例がもっと短くできることを知っていますが、私はすべての数字を表示するために計算方法を強調します.
 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
12 
13 DATE1 DATE2 SECONDS MINUTES HOURS DAYS WEEKS 
14 ----------------- ----------------- ---------- ---------- ---------- ---------- ---------- 
15 06202003:16:55:14 07082003:11:22:57 43 27 18 17 2 
16 06262003:11:16:36 07082003:11:22:57 21 6 0 12 1

2.TIMESTAMPデータ型


DATEデータ型の主な問題は,その粒度が2つのイベントのどちらが先に発生するかを十分に区別できないことである.ORACLEはすでにDATEデータ型にTIMESTAMPデータ型を拡張しており、すべてのDATEデータ型の年月日分秒の情報と小数秒の情報が含まれている.DATEタイプをTIMESTAMPタイプに変換したい場合はCAST関数を使用します.
1 SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t; 
2 Date 
3 ----------------------------------------------------- 
4 20-JUN-03 04.55.14.000000 PM 
5 26-JUN-03 11.16.36.000000 AM

ご覧のように、変換後の期間の末尾に「.0000」があります.これは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 
2 Date 
3 ------------------- 
4 06/20/2003 16:55:14 
5 06/26/2003 11:16:36

TIMESTAMPデータのフォーマット表示はDATEデータと同じです.注意、to_char関数はdateとtimestampをサポートしますが、truncはTIMESTAMPデータ型をサポートしません.これは,両時間の差が極めて重要な場合に,DATEデータ型よりもTIMESTAMPデータ型の方が正確であることを明らかにした.
1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS:FF3') "Date" FROM date_table
2 
3 Date 
4 ----------------------- 
5 06/20/2003 16:55:14:000 
6 06/26/2003 11:16:36:000

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
 9   
10 TIME1 TIME2 SECONDS MINUTES HOURS DAYS WEEKS 
11 ------------------------- -------------------------- ------- ------- ----- ---- ----- 
12 06/20/2003:16:55:14:000000 07/08/2003:11:22:57:000000 43 27 18 17 2 
13 06/26/2003:11:16:36:000000 07/08/2003:11:22:57:000000 21 06 00 12 1 

これは、面倒な計算の中で1日に何秒あるかに関心を持つ必要がないことを意味します.したがって,日数,月数,日数,時数,分数,秒数を得ることはsubstr関数で数字を取り出すこととなる.

3.システム日付と時刻


システム時間を得るためにdateデータ型に戻る.sysdate関数を使用できます.
1 SQL> SELECT SYSDATE FROM DUAL;

システム時間を得るためにtimestampデータ型に戻る.systimpstamp関数を使用できます.
1 SQL> SELECT SYSTIMESTAMP FROM DUAL;

初期化パラメータFIXED_を設定できますDATEはsysdate関数が固定値を返すことを指定します.これは、テスト日と時間に敏感なコードに使用されます.このパラメータはsystimestamp関数には無効であることに注意してください.
 1 SQL> ALTER SYSTEM SET fixed_date = '2003-01-01-10:00:00'; 
 2 System altered.
 3 
 4 SQL> select sysdate from dual; 
 5 SYSDATE 
 6 --------- 
 7 01-JAN-03
 8 
 9 SQL> select systimestamp from dual; 
10 SYSTIMESTAMP 
11 --------------------------------------------------------- 
12 09-JUL-03 11.05.02.519000 AM -06:00

4.dateとtimestampの違い


dateタイプは、Oracleでよく使用される日付型変数で、その間隔は秒です.2つの日付型が減算されるのは2つの時間の間隔で、注意単位は「日」です.例えば、ロンドンオリンピックの開幕まであとどのくらいの時間があるかを見てみましょう.
1 select to_date('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-sysdate from dual

結果は:92.2472685185185日、それからあなたは相応の時間によってあなたの望む間隔に換算すればいいです!この結果はプログラマーに役立つかもしれませんが、結果を直接見たい人には、この数字はまだ直感的ではないので、timestampタイプを引き出しました.
timestampはDATEタイプの拡張であり、小数秒(fractional_seconds_precision)まで正確であり、0 to 9であり、デフォルトは6である.2つのtimestampを減らすと、直接日数書を得ることはできません.何日、何時間、何秒などを得ることができます.例えば、ロンドンオリンピックの開幕までどのくらいの時間があるかを見てみましょう.
1 select to_timestamp('2012-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-systimestamp from dual

結果:+0000000092 05:51:24:032000000、少し切り取ると92日5時間、51分、24秒が得られ、ユーザーは直感的に見えます!しかし、この数字はプログラマーにとって直感的ではありません.具体的な時間の長さが必要で、精度がミリ秒未満であれば、timestampタイプをdateタイプに変換し、直接減算すればいいのです.

5.dateとtimestamp間の相互変換は


to_charはtimestampを変換します-->date:
1 select to_date(to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual

date ——>timestamp:
1 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に変換しようとすると、破壊をもたらすのに十分な場所があり、異なる場所があることに注意する必要があります.両者は簡潔さと間隔寸法の面でそれぞれ優位性がありますので、合理的に選んでください.