【Silver SQL試験対策】日付型が一番難しい

B!

日付型の種類

Oracleの日付型は以下6種類(期間データ型も含む)です。

DATE SYSDATE
TIMESTAMP SYSTIMESTAMP
TIMESTAMP WITH TIME ZONE CURRENT_TIMESTAMP
TIMESTAMP WITH LOCAL TIMEZONE LOCALTIMEStAMP
 INTERVAL YEAR TO MONTH SYSDATE + INTERVAL '1-1' YEAR TO MONTH
INTERVAL DAY TO SECOND SYSTIMESTAMP + INTERVAL '5 01:00:00' DAY TO SECOND

DATE型とTIMESTAMP型の違い:ミリ秒単位を含むのがTIMESTAMP(厳格なシステム以外は基本的に日付型はDATE型使うって言ってた。先輩が。)

 

TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITH TIME ZONE型の違い:

どちらもタイムゾーンの情報を格納するのですが、TIMESTAMP WITH TIME ZONE型がDBのタイムゾーンに変換されてデータが保存されます。例えばDBのタイムゾーンが「ASIA/TOKYO」の場合、ASIA/TOKYOのタイムゾーンに変換されて保存されます。

また、TIMESTAMP WITH TIME ZONE型を取得する時だけタイムゾーン名称が表示されます。「日付 時間 タイムゾーン名称」

 

INTERVALの違い:どちらも時刻の差分を管理するデータ型。年月がINTERVAL YEAR TO MONTH日と秒を管理するのがINTERVAL DAY TO SECOND。

タイムゾーンについて

Oracleは世界的に使用されるRDBMSのため各地域に合わせた時刻を表示することができます。(素人目線での説明です。)

  1. CURRENT_DATE(セッションのタイムゾーン)
  2. CURRENT_TIMESTAMP(セッションのタイムゾーン)
  3. SYSDATE(データベースのタイムゾーン)
  4. SYSTIMESTAMP(データベースのタイムゾーン)
  5. LOCALTIMESTAMP(セッションのタイムゾーン)
SQL>select systimestamp from dual;

SYSTIMESTAMP                   
-------------------------------
21-11-28 03:41:28.349648000 GMT

SQL>alter session set time_zone='Asia/Tokyo';

SQL>select current_timestamp from dual;
CURRENT_TIMESTAMP                     
--------------------------------------
21-11-28 12:41:28.360894000 ASIA/TOKYO
補足
下記構文で世界標準時刻との差が求めれます。自分のタイムゾーンが知りたいときなどにご使用を。
SELECT DBTIMEZONE FROM dual;

表示について

日付型には数値型や文字列型のように文字列を指定することができないのが特徴のひとつなのですが、システムによっては「年月のみ」「月と日のみ」といった表示をしたい時があると思います。

そんな時はNLS_DATE_FORMATという書式設定を変更することで表示形式を変えることができます。

SQL> select sysdate from dual;

SYSDATE
---------
27-NOV-21

SQL> alter session set NLS_DATE_FORMAT='YYYY/MM/DD';

Session altered.

SQL> select sysdate from dual;

SYSDATE
----------
2021/11/27

NLS_DATE_FORMATで設定の変更を行うことで書式が変更されるのですが、日付型の書式は以下の設定にも影響を受けます。

  • NLS_DATE_LANGUAGE
  • NLS_TERRITORY

NLS_DATE_LANGUAGEがAMERICANに設定されている場合、下記のようになります。

SQL> alter session set NLS_DATE_FORMAT='yyyy-mm-dd-day';

Session altered.

SQL> select sysdate from dual;

SYSDATE
--------------------
2021-11-28-sunday

NLS_DATE_LANGUAGをJapaneseに変更すると下記のようになります。

SQL>alter session set NLS_DATE_LANGUAGE='Japanese';

SYSDATE       
--------------
2021-11-28-日曜日

 

下記サイトが超わかりやすい解説をしてるので目を通してみてください。

知らないとチョットつまづく RDS for Oracle の NLS パラメータ

最新の記事はこちらから