我希望将时间戳列值与systimestamp值进行比较。我的表包含两列from_date和to_date,它们的数据类型为时间戳(6)。我想检查一下这样的东西
在检查systimestamp时,返回值带有时区,但是from_date和thru_date列值没有时区。
从dual中选择systimestamp;- 11/19/2016 03:35:55.042420000 PM +08:00
和from_date & thru_date喜欢的08/03/201506:09:56.941255000上午
请告诉我如何实现这一比较?我可以使用LOCALTIMESTAMP而不是SYSTIMESTAMP吗?或者在比较之前,我必须在from_date和to_date列上使用to_date函数?
发布于 2016-11-19 13:58:25
比较而言,Oracle必须执行隐式强制转换。我刚刚做了一个测试,Oracle在内部运行
systimestamp between CAST(from_date AS TIMESTAMP WITH TIME ZONE) and CAST(thru_date AS TIMESTAMP WITH TIME ZONE),
这相当于
systimestamp between FROM_TZ(from_date, SESSIONTIMEZONE) and FROM_TZ(thru_date, SESSIONTIMEZONE)
如果您当前的SESSIONTIMEZONE与数据库服务器操作系统的时区不同,查询将返回错误的结果。
为了得到正确的结果,您可以使用以下任何一种表达式:
CAST(systimestamp AS TIMESTAMP) between from_date and thru_date
systimestamp between FROM_TZ(from_date, EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP))
and FROM_TZ(thru_date, EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP))
systimestamp between FROM_TZ(from_date, TO_CHAR(SYSTIMESTAMP, 'TZR'))
and FROM_TZ(thru_date, TO_CHAR(SYSTIMESTAMP, 'TZR'))
systimestamp between FROM_TZ(from_date, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM'))
and FROM_TZ(thru_date, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM'))EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP)可能会失败,取决于您的服务器设置。
注意,不要使用DBTIMEZONE而不是TO_CHAR(SYSTIMESTAMP, 'TZR')。DBTIMEZONE不同于数据库服务器操作系统的时区。SYSTIMESTAMP的时区是在数据库服务器操作系统的时区,而不是DBTIMEZONE!
https://stackoverflow.com/questions/40690436
复制相似问题