2022年2月2日水曜日

セッション・パラメータSYSDATE_AT_DBTIMEZONEの効果を確認する

 Yasin Baskanさんが以下のツィートをしていたので、SYSDATE_AT_DBTIMEZONEの効果をAPEXで確認してみました。

作成直後のAlways FreeのAutonomous Databaseで作業をします。DBTIMEZONEを変更する必要がありますが、これはデータベースにひとつもTIMESTAMP WITH LOCAL TIME ZONE型の列が作られていないというのが条件です。この型の列が無ければ、DBTIMEZONEの変更はできるはずです。

データベース・アクションにADMINで接続し、SQLの画面から作業を行います。

最初に現在のDBTIMEZONEを確認します。ADBの作成直後はUTC = 00:00です。

select dbtimezone from dual;


DBTIMEZONEを変更します。

alter database set time_zone='09:00';


Autonomous Databaseを再起動したのち、先ほどのSELECT文を再度実行し、DBTIMEZONEを確認します。DBTIMEZONEとして+09:00が返されます。


APEXにて新規にアプリケーションを作成します。

名前SYSDATE確認とします。それ以外は何も設定せず、空のアプリケーションを作ります。アプリケーションの作成を実行します。


アプリケーションが作成されたら、アプリケーション・プロパティの編集を開きます。


グローバリゼーションアプリケーション日付書式YYYY-MM-DD HH24:MI:SSアプリケーションのタイムスタンプ・タイムゾーン書式YYYY-MM-DD HH24:MI:SS TZH:TZMを設定します。この設定は、DATEおよびTIMESTAMP WITH TIME ZONE型のデフォルトの書式マスクになります。

SYSDATEおよびSYSTIMESTAMPが返す日時に、自動タイムゾーンの設定は影響を与えませんが、混乱しないように、自動タイムゾーンOFFのままにします。

変更の適用をクリックします。


ページ・デザイナホーム・ページ(ページ番号1)を開き、対話モード・レポートのリージョンを作成します。

ソースタイプSQL問合せSQL問合せとして以下を記述します。

select sysdate,systimestamp from dual


ページを実行して、SYSDATEとSYSTIMESTA MPの値を確認します。この時点では、SYSDATEはUTCです。


アプリケーション・プロパティの確認を開き、セキュリティのタブを選択します。

データベース・セッション初期化PL/SQLコードに以下を記述し、変更の適用をクリックします。

begin
    execute immediate 'alter session set sysdate_at_dbtimezone = true';
end;


ホーム・ページを開き、SYSDATEとSYSTIMESTAMPの値を確認します。先ほどのUTCから9時間進んだ時刻、つまり日本時間で表示されていることが確認できます。


以上でSYSDATE_AT_DBTIMEZONEの効果を確認することができました。