【问题标题】:how to change the time zone to MST in sql query?如何在sql查询中将时区更改为MST?
【发布时间】:2020-02-12 00:05:16
【问题描述】:

我有一个以 MST 格式获取时区的查询。但是对于几行,它在 PT 中给出。

我使用的查询是 -

SELECT   cca.last_update_date,
to_char(cast(cast(cca.last_update_date as timestamp with time zone) at time zone 'MST' as timestamp),'HH:MI:SS AM') mst_time
FROM     CMP_CWB_AUDIT CCA

谁能帮我在sql查询中如何将时间格式更改为MST?

【问题讨论】:

  • last_update_date的数据类型是什么?
  • 时间戳@WernfriedDomscheit
  • 这些值的时区是什么?
  • 我不知道表中的当前时区。它可能会有所不同,但我希望输出具有 MST 时区
  • 当数据类型为TIMESTAMP(无时区)并且设计时不知道实际时区时,您无法将时区更改为 MST。 Oracle 没有内置水晶球。

标签: sql oracle plsql timezone datetime-format


【解决方案1】:

假设last_update_date 的时区在PST 中给出,您可以简单地运行

SELECT cca.last_update_date,
   from_tz(cca.last_update_date, 'PST') at time zone 'MST' AS mst_time
FROM CMP_CWB_AUDIT CCA

当您运行 cast(last_update_date as timestamp with time zone) 时,Oracle 实际上正在做

from_tz(last_update_date, SESSIONTIMEZONE)

如果您当前的会话时区是PST,则结果将是正确的。但是,由于SESSIONTIMEZONE 可能随时更改,因此结果可能是错误的。

当您的输出为'HH:MI:SS AM' 时,运行CAST(<TIMESTAMP WITH TIME ZONE> AS TIMESTAMP) 毫无意义,它不会改变任何东西。

【讨论】:

    【解决方案2】:

    TIMESTAMP 数据类型没有时区。但是如果您知道last_update_date 在MST 中,您可以使用FROM_TZ 函数将其转换为TIMESTAMP WITH TIME ZONE

    select from_tz( cca.last_update_date, 'MST' ) from CMP_CWB_AUDIT cca
    

    如果该列与 MST 位于不同的时区,您可以使用 AT TIME ZONE 子句对其进行转换:

    select from_tz( cca.last_update_date, 'UTC' ) at time zone 'MST' from CMP_CWB_AUDIT cca
    

    【讨论】:

    • 有没有办法知道列的时区?
    • “在与 MST 不同的时区”并不意味着 UTC。如果时区未知,则无法转换任何内容。
    • 时间转换是从pst到mst @WernfriedDomscheit
    • 是的,我只是以 UTC 为例。显然,需要知道列的时区,即使它不是数据类型的一部分。我认为,将内容存储在 DATETIMESTAMP 字段中是很常见的,其中时区被隐式假定为 db 时区。
    猜你喜欢
    • 2021-09-19
    • 2012-06-03
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多