java如何从Oracle获取时区ID而不是时区偏移量
有没有办法从oracle获取时区id而不是时区偏移量?
当我执行SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL;
时,返回的结果是13-JAN-21 10.19.52.936031000 AM +05:30
当我使用rs.getObject( "TIMEZONE ", ZonedDateTime.class )
从Java检索这个时,ZonedDateTime对象将offset
和zoneID
设置为+05:30
但是我希望看到的是,SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL;
应该返回04-JAN-21 02.40.50.000000000 PM ASIA/COLOMBO
,查询的Java ZonedDateTime应该将offset
设置为+05:30
,将zoneID
设置为Asia/Colombo
有没有一种方法可以在DB级或Java级进行设置?当前DBTIMEZONE
设置为+05:30
# 1 楼答案
如果数据已经在Oracle SQL表中,并且必须转换为带时区的时间戳(例如,在同一表中创建的新列中),则不需要显式转到操作系统,也不需要使用Java或Oracle数据库本身以外的任何其他东西
您的问题不清楚您是否必须假定“日期”在服务器时区(您提到的“数据库”通常指服务器)或客户端时区(您提到的“会话”指客户端)。无论哪种方式:
或者使用sessiontimezone作为第二个参数,如果您需要的话
这假设数据库(和/或会话)时区分别在数据库和客户机中正确设置。如果不是/他们不是,那需要先解决。如果参数一开始设置正确,Oracle完全能够处理白天节省的时间。(如果不是这样,我们也不清楚为什么要尝试让自己的操作比数据库一开始支持的操作“更正确”)
示例:在下面的WITH子句中,我模拟了一个数据类型为date的表,其中有一列dt。然后我将其转换为一个带有时区的时间戳,在会话的(客户端)时区中
为了便于参考,您可以查看此链接 StackOverflow Ref. Link
# 2 楼答案
SYSTIMESTAMP
在数据库操作系统的时区中返回-因此无法在数据库中更改它不要将数据库操作系统的时区与
DBTIMEZONE
混用,它们是不同的还要注意,时区
Asia/Colombo
与时区+05:30
不同,尽管它们(当前)具有相同的UTC偏移量时区
Asia/Colombo
考虑了夏令时的适用情况,它还包括changes。例如Asia/Colombo
在2006年从UTC+06:00更改为UTC+05:30。例如,因此TZ_OFFSET(TIMESTAMP '2020-01-01 12:00:00 Asia/Colombo')
返回的偏移量与TZ_OFFSET(TIMESTAMP '2000-01-01 12:00:00 Asia/Colombo')
不同时区
+05:30
总是UTC前5:30你的问题不是很清楚,你想得到什么
# 3 楼答案
Oracle TZ_OFFSET()函数返回有效时区名称或SESSIONTIMEZONE或DBTIMEZONE函数名称相对于UTC的时区偏移量
TZ_OFFSET()函数接受一个参数,该参数可以是有效的时区名称,例如“Europe/London”、SESSIONTIMEZONE或DBTIMEZONE的函数名,或者UTC的时区偏移量(它只返回自身)
结果将是+01:00
# 4 楼答案
这就是你如何获得时区的方法
# 5 楼答案
从某种意义上说,你运气不好
SYSTIMESTAMP
只返回操作系统报告的内容。时区是承载数据库的计算机系统的时区。它不是数据库时区(可能与数据库实际驻留的位置完全无关)或会话时区或诸如此类的东西。如果可以,您需要在db主机操作系统本身中进行更改如果您确信托管您的数据库的系统位于斯里兰卡,那么您可以通过以下方式间接获得您想要的:
# 6 楼答案
您可以使用
ALTER database
命令在数据库级别设置时区,如下所示:请注意,这将在重新启动数据库后生效