【问题标题】:ORA-01857: not a valid time zoneORA-01857: 不是有效的时区
【发布时间】:2019-04-10 21:06:02
【问题描述】:

我正在尝试从 UTC 时区转换为 GMT 时区。

我在下面的查询中运行了这个并得到 ORA 错误。

select NEW_TIME(SYSDATE, 'UTC', 'GMT') from dual;

错误是

Error starting at line : 1 in command -
select NEW_TIME(SYSDATE, 'UTC', 'GMT') from dual
Error report -
ORA-01857: not a valid time zone

我搜索了一下,发现 NEW_TIME 函数不接受 UTC 时区。

那么,您能否建议我替代解决方案/任何从 UTC 转换为 GMT 的方法?

【问题讨论】:

  • UTC (或多或少)与GMT 相同 - 术语GMT 只是“旧式”,请参阅UTC vs GMT

标签: sql oracle oracle11g


【解决方案1】:

UTC 也称为GMTNEW_TIME 已经接受后者。所以,你想要做的相当于:

SELECT NEW_TIME(SYSDATE, 'GMT', 'GMT')
FROM dual;

NEW_TIME 的调用当然没有任何意义。查看here 以获取可接受的时区代码列表。

【讨论】:

  • 感谢@Tim 的回复。但是我的代码正在生产中,在这里我硬编码了 UTC 值。但最初在代码中它被设置为 UTC 的 $TIMEZONE(即系统时区)。那么,我可以捕获这个异常,然后更新值并继续。
  • “Catch”什么异常,从哪里来?
  • @CrazyCoder 函数NEW_TIME(...) 不允许时区值UTC - 句点。你必须改变你的代码。
【解决方案2】:

使用FROM_TZ 将不带时区的时间戳转换为带时区的时间戳(即UTC),然后使用AT TIME ZONE 'GMT' 将其从第一个时区转换为GMT 时区。您需要在各个地方使用CAST,因为FROM_TZ 需要TIMESTAMP 而不是DATE,然后您需要在最后转换回DATE(假设您不想要TIMESTAMP值):

SELECT CAST(
         FROM_TZ(
           CAST( SYSDATE AS TIMESTAMP ),
           'UTC'
         )
         AT TIME ZONE 'GMT'
         AS DATE
       ) As gmt_time
FROM DUAL

输出

| GMT_TIME | | :----------------- | | 2019-04-10T14:05:37 |

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多