【问题标题】:How to compare timestamp(6) columns with systimestamp in oracle如何在 oracle 中将时间戳(6)列与 systimestamp 进行比较
【发布时间】:2017-04-03 02:13:51
【问题描述】:

我想将时间戳列值与 systimestamp 值进行比较。 我的表包含两列 from_date 和 to_date,数据类型为 timestamp(6)。我想检查这样的事情

  1. from_date 和 thru_date 之间的系统时间戳

在检查 systimestamp 时返回带有时区的值,但 from_date 和 thru_date 列的值没有时区

从对偶中选择系统时间戳; -- 2016 年 11 月 19 日 03:35:55.042420000 下午 +08:00

from_date 和 thru_date 就像 08/03/2015 06:09:56.941255000 AM

请告诉我如何进行这种比较? 我可以使用 LOCALTIMESTAMP 代替 SYSTIMESTAMP 吗?或者我必须在比较之前对 from_date 和 to_date 列使用 from_tz 函数?

【问题讨论】:

  • 这些栏目是当地时间吗?如果是,您可以使用 LOCALTIMESTAMP。
  • 没有这些列包含服务器时区时间

标签: oracle timestamp


【解决方案1】:

为了比较,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

【讨论】:

  • 您能否解释一下这一点 - EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP) 或 TO_CHAR(SYSTIMESTAMP, 'TZR') 可能会失败,具体取决于您的服务器设置。
  • TO_CHAR(SYSTIMESTAMP, 'TZR') 在任何情况下都应该有效。通常操作系统的时区以 UTC 偏移量给出,而不是作为区域(至少在我们的前提下)。 SELECT EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP) FROM dual; 返回 UNKNOWN,这当然是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2012-09-15
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多