همانطور که می دانید توابع SYSDATE و SYSTIMESTAMP ساعت جاری سیستم را برمی گردانند این توابع date را بر اساس time zone سیستم عامل نمایش می دهند و اگر time zone متفاوتی برای دیتابیس تنظیم شود، تغییری در رفتار این توابع ایجاد نمی شود:
[oracle@OEL8 ~]$ timedatectl Local time: Thu 2024-02-15 13:14:48 +0330 Universal time: Thu 2024-02-15 09:44:48 UTC RTC time: Thu 2024-02-15 07:37:09 Time zone: Asia/Tehran (+0330, +0330)
SQL> select sysdate , SYSTIMESTAMP ; SYSDATE SYSTIMESTAMP --------- ---------------------------------------- 15-FEB-24 15-FEB-24 01.25.54.270895 PM +03:30 SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tokyo'; Database altered. SQL> select sysdate , SYSTIMESTAMP ; SYSDATE SYSTIMESTAMP --------- ---------------------------------------- 15-FEB-24 15-FEB-24 01.26.37.200429 PM +03:30
در نسخه 23ai می توان با تنظیم پارامتر time_at_dbtimezone به مقدار USER_SQL این توابع را مجاب کرد تا date را بر اساس time zone دیتابیس برگردانند صرف نظر از time zone سیستم عامل!
در ادامه برای هر کدام از PDBهای موجود در دیتابیس، time zone متفاوتی را تنظیم می کنیم:
SQL> alter session set container=TOKYOPDB; Session altered. SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tokyo'; System altered. SQL> alter session set container=TEHRANPDB; Session altered. SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tehran'; Database altered.
پارامتر time_at_dbtimezone را هم به مقدار USER_SQL تنظیم کرده و دیتابیس را restart می کنیم:
SQL> alter system set time_at_dbtimezone=USER_SQL scope=spfile; System altered. SQL> startup force;
خواهیم دید که این توابع در هر PDB مقدار متفاوتی را برمیگردانند:
SQL> alter session set container=TOKYOPDB; Session altered. SQL> select sysdate , SYSTIMESTAMP ; SYSDATE SYSTIMESTAMP --------- ---------------------------------------- 15-FEB-24 15-FEB-24 07.13.36.575056 PM ASIA/TOKYO
SQL> alter session set container=TEHRANPDB; Session altered. SQL> select sysdate , SYSTIMESTAMP ; SYSDATE SYSTIMESTAMP --------- ---------------------------------------- 15-FEB-24 15-FEB-24 01.43.47.339588 PM ASIA/TEHRAN