如何在oracle中将timestamp(6)列与systimestamp进行比较

时间:2016-11-19 07:40:40

标签: oracle timestamp

我想将timestamp列值与systimestamp值进行比较。 我的表包含两列from_date和to_date,数据类型为timestamp(6)。我想检查一下这样的东西

  1. from_date和thru_date之间的systimestamp
  2. 检查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函数?

1 个答案:

答案 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)代替DBTIMEZONETO_CHAR(SYSTIMESTAMP, 'TZR')可以与数据库服务器的操作系统的时区不同。 DBTIMEZONE的时区在数据库服务器操作系统的时区中给出,而不是SYSTIMESTAMP