助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26981
問題を開く
データ型のTIMESTAMP WITH LOCAL TIME ZONE型の説明として正しいものはどれですか(2つ選択して下さい)。

正解

データベースのタイム・ゾーンに変換された日時を格納する

データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す

解説

以下は日時を表すデータ型です。


TIMESTAMP WITH LOCAL TIME ZONEデータ型は、タイム・ゾーンの情報を含みません。
また、データの検索時にはクライアントのローカルセッションのタイム・ゾーンに変換された値を返します。

以上より、
・データベースのタイム・ゾーンに変換された日時を格納する
・データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す
が正解です。

以下はTIMESTAMP WITH LOCAL TIME ZONE型の列を持つ表の例です。

SQLを表示
SELECT DBTIMEZONE FROM dual;

SELECT SESSIONTIMEZONE FROM dual;

CREATE TABLE t2 (col TIMESTAMP WITH LOCAL TIME ZONE);

INSERT INTO t2 VALUES (SYSTIMESTAMP);

SELECT SYSTIMESTAMP FROM dual;

SELECT * FROM t2;

ALTER SESSION SET TIME_ZONE='-05:00';

SELECT * FROM t2;


その他の選択肢については以下のとおりです。

・TIMESTAMP型の値に加えてセッションのタイム・ゾーンを格納する
・データ検索時には格納されたタイム・ゾーンを返す
これらはTIMESTAMP WITH TIME ZONEの説明なので、誤りです。

・秒の小数点以下は格納しない
TIMESTAMP型の日時を格納するので、秒の小数点以下も含みます。よって誤りです。

参考

【タイム・ゾーン】
タイム・ゾーンとは同じ標準時(基準時刻との差)を扱う地域のことで、データベースにおいてはシステム運用の標準時を設定する項目です。データベースを世界中のいくつかの地域で使用する場合、それぞれの地域のタイム・ゾーンでデータを入力します。
タイム・ゾーンには「+09:00」のようなUTC(Coordinated Universal Time:協定世界時)との時間差(オフセット)か、「Asia/Tokyo」のようなタイム・ゾーン地域名を設定します。どちらの例も日本標準時を示します。

以下はデータベースのタイム・ゾーンや日時を返す関数です。



・DBTIMEZONEとSESSIONTIMEZONE
DBTIMEZONEは、CREATE DATABASE時やALTER DATABASE時にTIME_ZONE句に指定したタイム・ゾーンです。デフォルト値は日本語環境でも「+00:00」になっています。

SQLを表示
SELECT DBTIMEZONE FROM dual;


SESSIONTIMEZONEは、ALTER SESSION時にTIME_ZONE句に指定したタイム・ゾーンです。

SQLを表示
SELECT SESSIONTIMEZONE FROM dual;

ALTER SESSION SET TIME_ZONE='America/New_York';

SELECT SESSIONTIMEZONE FROM dual;


・SYSDATEとSYSTIMESTAMP
これらはデータベースが稼働するOSの現在の日時を返します。
SYSDATEがDATE型で現在の日時の秒までを返すのに対し、SYSTIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。TIMESTAMP WITH TIME ZONEデータ型は、DATE型の値に加え秒の小数点以下の値とタイム・ゾーンの情報も含みます。

SQLを表示
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;

SELECT SYSTIMESTAMP FROM dual;


・CURRENT_DATE、CURRENT_TIMESTAMP、LOCALTIMESTAMP
これらは現行セッションのタイム・ゾーンの現在の日時を返します。

CURRENT_DATEがDATE型で現在の日時の秒までを返すのに対し、CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。

SQLを表示
SELECT SESSIONTIMEZONE FROM dual;

SELECT TO_CHAR(CURRENT_DATE, 'RR-MM-DD HH24:MI:SS') FROM dual;

SELECT CURRENT_TIMESTAMP FROM dual;


LOCALTIMESTAMPはTIMESTAMP型で返し、CURRENT_TIMESTAMPのようにタイム・ゾーンの情報は含みません。

SQLを表示
SELECT LOCALTIMESTAMP FROM dual;


【データ型】
以下は日時を表すデータ型です。



DATE型やTIMESTAMP型の列に値を格納するためには、日付リテラルを使用するか、文字列や数値をTO_DATE関数、TO_TIMESTAMP関数でそれぞれDATE型、TIMESTAMP型の値に変換します。


SQLを表示
CREATE TABLE time1
( date1 DATE,
timestamp1 TIMESTAMP);

INSERT INTO time1
VALUES('12-12-10', '12-12-10 14:10:10.123456');

INSERT INTO time1
VALUES(TO_DATE('12-12-20 10:10:10', 'RR-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('12-12-20 10:10:10.987654',
'RR-MM-DD HH24:MI:SS.FF'));

SELECT * FROM time1;


以下は期間を表すデータ型です。



INTERVAL YEAR TO MONTH型は期間を年、月の単位で格納します(「5年6カ月」など)。
INTERVAL DAY TO SECOND型は期間を日、時、分、秒の単位で格納します(「10日と12時間30分30秒」など)。

INTERVAL YEAR TO MONTH型やINTERVAL DAY TO SECOND型に値を格納するためには、以下のような期間リテラルを使用します。負の数値も格納できます。

・INTERVAL '5-6' YEAR TO MONTH:5年6ヶ月
・INTERVAL '100' YEAR(3):100年
・INTERVAL '300' MONTH(3):300ヶ月
・INTERVAL '10 12:30:30' DAY TO SECOND:10日と12時間30分30秒
・INTERVAL '10 12:30:30.555555' DAY TO SECOND:10日と12時間30分30.555555秒
 ※SECOND(秒フィールド)には秒の小数点以下も格納できます
 ※年や月の精度が2桁より大きい場合は、YEAR(3)などのように精度を指定します

期間を表すデータ型はDATE型との演算が可能です。例えば、「〇年△ヶ月」の期間を表すデータ型を使って現在の日時に加算することで、わかりやすく「〇年△ヶ月」経過後の日時を取得することができます。減算した場合は過去の日時となります。

SQLを表示
CREATE TABLE term
(
termA INTERVAL YEAR TO MONTH,
termB INTERVAL DAY TO SECOND
);

INSERT INTO term
VALUES (INTERVAL '5-6' YEAR TO MONTH,
INTERVAL '10 12:30:30' DAY TO SECOND);

SELECT TO_CHAR(SYSDATE, 'RR-MM-DD HH24:MI:SS'),
TO_CHAR(SYSDATE + termA, 'RR-MM-DD'),
TO_CHAR(SYSDATE + termB, 'RR-MM-DD HH24:MI:SS')
FROM term;


以下はINTERVAL YEAR TO MONTHの年と、INTERVAL DAY TO SECONDの日に負の数値を格納した場合の例です。
SYSDATE(現在日時)にこれらを加算すると、過去の日時となります。

SQLを表示
CREATE TABLE term
(
termA INTERVAL YEAR TO MONTH,
termB INTERVAL DAY TO SECOND
);

INSERT INTO term
VALUES (INTERVAL '-10-2' YEAR TO MONTH,
INTERVAL '10 12:30:30' DAY TO SECOND);

SELECT TO_CHAR(SYSDATE, 'RR-MM-DD HH24:MI:SS') "today",
TO_CHAR(SYSDATE + termA, 'RR-MM-DD') "termA",
TO_CHAR(SYSDATE + termB, 'RR-MM-DD HH24:MI:SS') "termB"
FROM term;
上に戻る

解説の誤り

公開日 2024/05/06

TIMESTAMP WITH LOCAL TIME ZONEデータ型は、TIMESTAMP型の値に加えデータベースのタイム・ゾーンの情報も含みます。
また、データの検索時にはクライアントのローカルセッションのタイム・ゾーンに変換された値を返します。
以上より、
・TIMESTAMP型の値に加えてデータベースのタイム・ゾーンを格納する
・データ検索時にはクライアントのセッションのタイム・ゾーンを返す
が正解です。

とありますが、

TIMESTAMP WITH LOCAL TIME ZONEデータ型は、タイム・ゾーンの情報を含まない。
また、データの検索時にはクライアントのローカルセッションのタイム・ゾーンに変換された値を返します。
以上より、
データベースのタイム・ゾーンに変換された日時を格納する
データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す
が正解です。
の間違いではないでしょうか?違っていましたらすみません。

スタッフからの返信

s staff_ishii

2024/05/07 15:39

tsukasa39 さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?