助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26981
問題を開く
データ型のTIMESTAMP WITH LOCAL TIME ZONE型の説明として正しいものはどれですか(2つ選択して下さい)。
正解
データベースのタイム・ゾーンに変換された日時を格納する
データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す
解説
以下は日時を表すデータ型です。
![<img src="/mondai3/img/jpg/kkkkk52619.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20033/kkkkk52619.jpg)
TIMESTAMP WITH LOCAL TIME ZONEデータ型は、タイム・ゾーンの情報を含みません。
また、データの検索時にはクライアントのローカルセッションのタイム・ゾーンに変換された値を返します。
以上より、
・データベースのタイム・ゾーンに変換された日時を格納する
・データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す
が正解です。
以下はTIMESTAMP WITH LOCAL TIME ZONE型の列を持つ表の例です。
![【図を表示】](https://ping-t-resouces.com/uploads/question_image/file/20449/k52637.jpg)
その他の選択肢については以下のとおりです。
・TIMESTAMP型の値に加えてセッションのタイム・ゾーンを格納する
・データ検索時には格納されたタイム・ゾーンを返す
これらはTIMESTAMP WITH TIME ZONEの説明なので、誤りです。
・秒の小数点以下は格納しない
TIMESTAMP型の日時を格納するので、秒の小数点以下も含みます。よって誤りです。
![<img src="/mondai3/img/jpg/kkkkk52619.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20033/kkkkk52619.jpg)
TIMESTAMP WITH LOCAL TIME ZONEデータ型は、タイム・ゾーンの情報を含みません。
また、データの検索時にはクライアントのローカルセッションのタイム・ゾーンに変換された値を返します。
以上より、
・データベースのタイム・ゾーンに変換された日時を格納する
・データ検索時にはクライアントのセッションのタイム・ゾーンに変換された日時を返す
が正解です。
以下はTIMESTAMP WITH LOCAL TIME ZONE型の列を持つ表の例です。
![【図を表示】](https://ping-t-resouces.com/uploads/question_image/file/20449/k52637.jpg)
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;
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」のようなタイム・ゾーン地域名を設定します。どちらの例も日本標準時を示します。
以下はデータベースのタイム・ゾーンや日時を返す関数です。
![【図を表示】](https://ping-t-resouces.com/uploads/question_image/file/20027/k52619.jpg)
・DBTIMEZONEとSESSIONTIMEZONE
DBTIMEZONEは、CREATE DATABASE時やALTER DATABASE時にTIME_ZONE句に指定したタイム・ゾーンです。デフォルト値は日本語環境でも「+00:00」になっています。
![【図を表示2】](https://ping-t-resouces.com/uploads/question_image/file/20028/kk52619.jpg)
SESSIONTIMEZONEは、ALTER SESSION時にTIME_ZONE句に指定したタイム・ゾーンです。
![<img src="/mondai3/img/jpg/k52624.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20029/k52624.jpg)
・SYSDATEとSYSTIMESTAMP
これらはデータベースが稼働するOSの現在の日時を返します。
SYSDATEがDATE型で現在の日時の秒までを返すのに対し、SYSTIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。TIMESTAMP WITH TIME ZONEデータ型は、DATE型の値に加え秒の小数点以下の値とタイム・ゾーンの情報も含みます。
![<img src="/mondai3/img/jpg/k52625.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20030/k52625.jpg)
・CURRENT_DATE、CURRENT_TIMESTAMP、LOCALTIMESTAMP
これらは現行セッションのタイム・ゾーンの現在の日時を返します。
CURRENT_DATEがDATE型で現在の日時の秒までを返すのに対し、CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。
![【図を表示3】](https://ping-t-resouces.com/uploads/question_image/file/20031/kkk52619.jpg)
LOCALTIMESTAMPはTIMESTAMP型で返し、CURRENT_TIMESTAMPのようにタイム・ゾーンの情報は含みません。
![【図を表示4】](https://ping-t-resouces.com/uploads/question_image/file/20032/kkkk52619.jpg)
【データ型】
以下は日時を表すデータ型です。
![【図を表示5】](https://ping-t-resouces.com/uploads/question_image/file/20033/kkkkk52619.jpg)
DATE型やTIMESTAMP型の列に値を格納するためには、日付リテラルを使用するか、文字列や数値をTO_DATE関数、TO_TIMESTAMP関数でそれぞれDATE型、TIMESTAMP型の値に変換します。
![<img src="/mondai3/img/jpg/kkk49221.jpg">](https://ping-t-resouces.com/uploads/question_image/file/19915/kkk49221.jpg)
以下は期間を表すデータ型です。
![【図を表示6】](https://ping-t-resouces.com/uploads/question_image/file/20034/kkkkkk52619.jpg)
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型との演算が可能です。例えば、「〇年△ヶ月」の期間を表すデータ型を使って現在の日時に加算することで、わかりやすく「〇年△ヶ月」経過後の日時を取得することができます。減算した場合は過去の日時となります。
![<img src="/mondai3/img/jpg/kkk49105.jpg">](https://ping-t-resouces.com/uploads/question_image/file/19913/kkk49105.jpg)
以下はINTERVAL YEAR TO MONTHの年と、INTERVAL DAY TO SECONDの日に負の数値を格納した場合の例です。
SYSDATE(現在日時)にこれらを加算すると、過去の日時となります。
![<img src="/mondai3/img/jpg/k56976.jpg">](https://ping-t-resouces.com/uploads/question_image/file/21744/k56976.jpg)
タイム・ゾーンとは同じ標準時(基準時刻との差)を扱う地域のことで、データベースにおいてはシステム運用の標準時を設定する項目です。データベースを世界中のいくつかの地域で使用する場合、それぞれの地域のタイム・ゾーンでデータを入力します。
タイム・ゾーンには「+09:00」のようなUTC(Coordinated Universal Time:協定世界時)との時間差(オフセット)か、「Asia/Tokyo」のようなタイム・ゾーン地域名を設定します。どちらの例も日本標準時を示します。
以下はデータベースのタイム・ゾーンや日時を返す関数です。
![【図を表示】](https://ping-t-resouces.com/uploads/question_image/file/20027/k52619.jpg)
・DBTIMEZONEとSESSIONTIMEZONE
DBTIMEZONEは、CREATE DATABASE時やALTER DATABASE時にTIME_ZONE句に指定したタイム・ゾーンです。デフォルト値は日本語環境でも「+00:00」になっています。
![【図を表示2】](https://ping-t-resouces.com/uploads/question_image/file/20028/kk52619.jpg)
SQLを表示
SELECT DBTIMEZONE FROM dual;
SESSIONTIMEZONEは、ALTER SESSION時にTIME_ZONE句に指定したタイム・ゾーンです。
![<img src="/mondai3/img/jpg/k52624.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20029/k52624.jpg)
SQLを表示
SELECT SESSIONTIMEZONE FROM dual;
ALTER SESSION SET TIME_ZONE='America/New_York';
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型の値に加え秒の小数点以下の値とタイム・ゾーンの情報も含みます。
![<img src="/mondai3/img/jpg/k52625.jpg">](https://ping-t-resouces.com/uploads/question_image/file/20030/k52625.jpg)
SQLを表示
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
SELECT SYSTIMESTAMP FROM dual;
SELECT SYSTIMESTAMP FROM dual;
・CURRENT_DATE、CURRENT_TIMESTAMP、LOCALTIMESTAMP
これらは現行セッションのタイム・ゾーンの現在の日時を返します。
CURRENT_DATEがDATE型で現在の日時の秒までを返すのに対し、CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。
![【図を表示3】](https://ping-t-resouces.com/uploads/question_image/file/20031/kkk52619.jpg)
SQLを表示
SELECT SESSIONTIMEZONE FROM dual;
SELECT TO_CHAR(CURRENT_DATE, 'RR-MM-DD HH24:MI:SS') FROM dual;
SELECT CURRENT_TIMESTAMP FROM dual;
SELECT TO_CHAR(CURRENT_DATE, 'RR-MM-DD HH24:MI:SS') FROM dual;
SELECT CURRENT_TIMESTAMP FROM dual;
LOCALTIMESTAMPはTIMESTAMP型で返し、CURRENT_TIMESTAMPのようにタイム・ゾーンの情報は含みません。
![【図を表示4】](https://ping-t-resouces.com/uploads/question_image/file/20032/kkkk52619.jpg)
SQLを表示
SELECT LOCALTIMESTAMP FROM dual;
【データ型】
以下は日時を表すデータ型です。
![【図を表示5】](https://ping-t-resouces.com/uploads/question_image/file/20033/kkkkk52619.jpg)
DATE型やTIMESTAMP型の列に値を格納するためには、日付リテラルを使用するか、文字列や数値をTO_DATE関数、TO_TIMESTAMP関数でそれぞれDATE型、TIMESTAMP型の値に変換します。
![<img src="/mondai3/img/jpg/kkk49221.jpg">](https://ping-t-resouces.com/uploads/question_image/file/19915/kkk49221.jpg)
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;
( 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;
以下は期間を表すデータ型です。
![【図を表示6】](https://ping-t-resouces.com/uploads/question_image/file/20034/kkkkkk52619.jpg)
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型との演算が可能です。例えば、「〇年△ヶ月」の期間を表すデータ型を使って現在の日時に加算することで、わかりやすく「〇年△ヶ月」経過後の日時を取得することができます。減算した場合は過去の日時となります。
![<img src="/mondai3/img/jpg/kkk49105.jpg">](https://ping-t-resouces.com/uploads/question_image/file/19913/kkk49105.jpg)
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;
(
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(現在日時)にこれらを加算すると、過去の日時となります。
![<img src="/mondai3/img/jpg/k56976.jpg">](https://ping-t-resouces.com/uploads/question_image/file/21744/k56976.jpg)
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;
(
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 さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。