【问题标题】:Oracle: systimestamp at time zone error when selectingOracle:选择时区错误时的 systimestamp
【发布时间】:2015-01-28 08:57:48
【问题描述】:

我正在尝试创建一个选择语句来获取客户端本地时区值的时间。

因此我编写了查询

select 
    systimestamp at time zone :TZ
from 
    DUAL;

这给了我错误

ORA-00923: FROM keyword not found where expected
00923. 00000 -  "FROM keyword not found where expected"
*Cause:    
*Action:
Error at Line: 2 Column: 21

我已经在网上搜索过,但我找不到使用绑定参数来动态更改我对所需时区的查询的方法。

提前致谢。 万岁甲骨文!!

【问题讨论】:

    标签: sql database oracle timezone


    【解决方案1】:

    From the documentation,时区可以是文字或表达式;所以它不能直接是绑定变量,但是你可以将变量传递给一个函数,把它变成一个表达式:

    var TZ varchar2(10)
    exec :TZ := 'America/New_York';
    
    select 
        systimestamp at time zone trim(:TZ)
    from 
        DUAL;
    
    SYSTIMESTAMPATTIMEZONETRIM(:TZ)    
    -----------------------------------
    28-JAN-15 04.05.41.084443000 AMERIC 
    A/NEW_YORK                          
    

    任何良性功能都可以。

    虽然如果你想要客户端的本地时间,你可以使用at local来代替:

    如果您指定 AT LOCAL,则 Oracle 使用当前会话时区。

    ...或者只使用current_timestamp

    select current_timestamp from dual;
    

    【讨论】:

    • 但是。我听说“在本地”子句将使用客户端时区设置。但是,如果他设置了错误的时区怎么办。我不想冒险。..
    • 那么你应该有一个单独的表来管理用户时区。
    • 是的。这已经实施。绑定变量从表中获取值。
    【解决方案2】:
    select 
        current_timestamp||':'||:TZ
    from 
        DUAL;
    

    【讨论】:

    • 非常抱歉,总统先生,但 current_timestamp 将始终返回当前时区(客户端)的时间,可能设置错误。我想获取服务器时间并向客户显示他的时区时间。感谢您的帮助。
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2012-12-11
    • 2021-09-12
    • 2015-08-03
    相关资源
    最近更新 更多