我想将timestamp列值与systimestamp值进行比较。 我的表包含两列from_date和to_date,数据类型为timestamp(6)。我想检查一下这样的东西
检查systimestamp后返回带时区的值,但from_date和thru_date列的值没有时区
从dual中选择systimestamp; - 2016年11月19日03:35:55.042420000 PM +08:00
和from_date& thru_date喜欢08/03/2015 06:09:56.941255000 AM
请告诉我如何实现这种比较? 我可以使用LOCALTIMESTAMP而不是SYSTIMESTAMP吗?或者我必须在比较之前在from_date和to_date列上使用from_tz函数?
答案 0 :(得分:1)
为了进行比较,Oracle必须执行隐式转换。我刚做了一个测试,Oracle在内部运行
\\1
,
相当于
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
!