助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26986
問題を開く
関数の説明として正しいものはどれですか(2つ選択して下さい)。
正解
DBTIMEZONEとSESSIONTIMEZONEにはUTCとのオフセットかタイム・ゾーン地域名を設定できる
CURRENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない
解説
以下はデータベースのタイム・ゾーンや日時を返す関数です。
タイム・ゾーンには「+09:00」のようなUTC(Coordinated Universal Time:協定世界時)との時間差(オフセット)か、「Asia/Tokyo」のようなタイム・ゾーン地域名を設定します。
CURRENT_DATEはDATE型、LOCALTIMESTAMPはTIMESTAMP型で値を返し、タイム・ゾーンの情報は含みません。
以上より、
・DBTIMEZONEとSESSIONTIMEZONEにはUTCとのオフセットかタイム・ゾーン地域名を設定できる
・CURRENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない
が正解です。
その他の選択肢については以下のとおりです。
・SYSTIMESTAMPとCURRENT_DATEは同じデータ型で値を返す
SYSTIMESTAMP(OSの現在の日時)はTIMESTAMP WITH TIME ZONE型で、CURRENT_DATE(セッションのタイム・ゾーンの現在の日時)はDATE型で返すので、誤りです。
・SYSDATEとCURRENT_TIMESTAMPはDATE型の値を返す
CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONE型の値を返すので、誤りです。
・CURRENT_TIMESTAMPとLOCALTIMESTAMPはOSの現在の日時を返す
どちらもセッションのタイム・ゾーンの現在の日時を返すので、誤りです。
タイム・ゾーンには「+09:00」のようなUTC(Coordinated Universal Time:協定世界時)との時間差(オフセット)か、「Asia/Tokyo」のようなタイム・ゾーン地域名を設定します。
CURRENT_DATEはDATE型、LOCALTIMESTAMPはTIMESTAMP型で値を返し、タイム・ゾーンの情報は含みません。
以上より、
・DBTIMEZONEとSESSIONTIMEZONEにはUTCとのオフセットかタイム・ゾーン地域名を設定できる
・CURRENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない
が正解です。
その他の選択肢については以下のとおりです。
・SYSTIMESTAMPとCURRENT_DATEは同じデータ型で値を返す
SYSTIMESTAMP(OSの現在の日時)はTIMESTAMP WITH TIME ZONE型で、CURRENT_DATE(セッションのタイム・ゾーンの現在の日時)はDATE型で返すので、誤りです。
・SYSDATEとCURRENT_TIMESTAMPはDATE型の値を返す
CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONE型の値を返すので、誤りです。
・CURRENT_TIMESTAMPとLOCALTIMESTAMPはOSの現在の日時を返す
どちらもセッションのタイム・ゾーンの現在の日時を返すので、誤りです。
参考
【タイム・ゾーン】
タイム・ゾーンとは同じ標準時(基準時刻との差)を扱う地域のことで、データベースにおいてはシステム運用の標準時を設定する項目です。データベースを世界中のいくつかの地域で使用する場合、それぞれの地域のタイム・ゾーンでデータを入力します。
タイム・ゾーンには「+09:00」のようなUTC(Coordinated Universal Time:協定世界時)との時間差(オフセット)か、「Asia/Tokyo」のようなタイム・ゾーン地域名を設定します。どちらの例も日本標準時を示します。
以下はデータベースのタイム・ゾーンや日時を返す関数です。
・DBTIMEZONEとSESSIONTIMEZONE
DBTIMEZONEは、CREATE DATABASE時やALTER DATABASE時にTIME_ZONE句に指定したタイム・ゾーンです。デフォルト値は日本語環境でも「+00:00」になっています。
SESSIONTIMEZONEは、ALTER SESSION時にTIME_ZONE句に指定したタイム・ゾーンです。
・SYSDATEとSYSTIMESTAMP
これらはデータベースが稼働するOSの現在の日時を返します。
SYSDATEがDATE型で現在の日時の秒までを返すのに対し、SYSTIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。TIMESTAMP WITH TIME ZONEデータ型は、DATE型の値に加え秒の小数点以下の値とタイム・ゾーンの情報も含みます。
・CURRENT_DATE、CURRENT_TIMESTAMP、LOCALTIMESTAMP
これらは現行セッションのタイム・ゾーンの現在の日時を返します。
CURRENT_DATEがDATE型で現在の日時の秒までを返すのに対し、CURRENT_TIMESTAMPはTIMESTAMP WITH TIME ZONEデータ型で返します。
LOCALTIMESTAMPはTIMESTAMP型で返し、CURRENT_TIMESTAMPのようにタイム・ゾーンの情報は含みません。
【データ型】
以下は日時を表すデータ型です。
DATE型やTIMESTAMP型の列に値を格納するためには、日付リテラルを使用するか、文字列や数値をTO_DATE関数、TO_TIMESTAMP関数でそれぞれDATE型、TIMESTAMP型の値に変換します。
以下は期間を表すデータ型です。
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型との演算が可能です。例えば、「〇年△ヶ月」の期間を表すデータ型を使って現在の日時に加算することで、わかりやすく「〇年△ヶ月」経過後の日時を取得することができます。減算した場合は過去の日時となります。
以下はINTERVAL YEAR TO MONTHの年と、INTERVAL DAY TO SECONDの日に負の数値を格納した場合の例です。
SYSDATE(現在日時)にこれらを加算すると、過去の日時となります。
タイム・ゾーンとは同じ標準時(基準時刻との差)を扱う地域のことで、データベースにおいてはシステム運用の標準時を設定する項目です。データベースを世界中のいくつかの地域で使用する場合、それぞれの地域のタイム・ゾーンでデータを入力します。
タイム・ゾーンには「+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;
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;
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;
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;
( 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;
(
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;
(
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;
正解のコマンドが間違っています。
A
Andrew22
投稿日 2024/04/12
CUREENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない → CURRENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない
スタッフからの返信
この投稿に対して返信しませんか?
s staff_ishii
2024/04/12 12:21
Andrew22 さん ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。