Yasin Baskanさんが以下のツィートをしていたので、SYSDATE_AT_DBTIMEZONEの効果をAPEXで確認してみました。
作成直後のAlways FreeのAutonomous Databaseで作業をします。DBTIMEZONEを変更する必要がありますが、これはデータベースにひとつもTIMESTAMP WITH LOCAL TIME ZONE型の列が作られていないというのが条件です。この型の列が無ければ、DBTIMEZONEの変更はできるはずです。Autonomous Database uses UTC as the default OS and DB timezone. You can now change the DB timezone and have SYSDATE and SYSTIMESTAMP return date/time based on that timezone using the new parameter SYSDATE_AT_DBTIMEZONE. https://t.co/d9PVfKr0wa pic.twitter.com/MRn5uKZocS
— Yasin Baskan (@yasinbaskan) February 1, 2022
データベース・アクションに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型のデフォルトの書式マスクになります。
変更の適用をクリックします。
ページ・デザイナでホーム・ページ(ページ番号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時間進んだ時刻、つまり日本時間で表示されていることが確認できます。
完