助け合いフォーラム

Oracle DB

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」のようなタイム・ゾーン地域名を設定します。どちらの例も日本標準時を示します。

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



・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/04/12

CUREENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない → CURRENT_DATEとLOCALTIMESTAMPはタイム・ゾーンを含まない

スタッフからの返信

s staff_ishii

2024/04/12 12:21

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

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