【问题标题】:I want to adjust a date for summer/winter time and time zone when insterting it into a table我想在将夏/冬时间和时区插入表格时调整日期
【发布时间】:2014-11-10 10:51:39
【问题描述】:

我在 TABLE_A 中有一个以 GMT 表示的日期和时间变量。我想将此日期和时间插入 TABLE_B,但我希望根据时区和夏季/冬季时间调整插入的值。 那就是:

 INSERT into TABLE_A (ADJUSTED_DATE_AND_TIME)

 SELECT GMT_DATE_AND_TIME [Perform proper adjustments here..?]

 FROM TABLE_A

我可以这样做吗?那样的话,我该怎么写呢?

谢谢。

【问题讨论】:

    标签: sql oracle utc


    【解决方案1】:

    我认为您可以简单地转换 GMT/UTC 时间。但是,您必须使用您所在时区的完整区域名称。

    SELECT TIMESTAMP '2014-06-10 12:00:00 +00:00' AT TIME ZONE 'Europe/Zurich' AS summer FROM dual;
    
    SUMMER                                 
    ---------------------------------------
    10.06.2014 14:00:00.000000000 +02:00   
    
    
    SELECT TIMESTAMP '2014-12-10 12:00:00 +00:00' AT TIME ZONE 'Europe/Zurich' AS winter FROM dual;
    
    WINTER                                 
    ---------------------------------------
    10.12.2014 13:00:00.000000000 +01:00   
    

    由于您的源值是数据类型DATE,您必须执行以下步骤。

    1. DATE 转换为TIMESTAMP
    2. 使用FROM_TZ设置值的时区
    3. 使用AT TIME ZONE '...' 将值转换为新时区
    4. 将值转换为DATE

    写在一个语句中

    select 
    CAST(FROM_TZ(CAST(sy_sttime AS TIMESTAMP), 'UTC') AT TIME ZONE 'Europe/Zurich' AS DATE)
    from sy_request
    

    或者说不太清楚

    select
    CAST((CAST(sy_sttime AS TIMESTAMP) AT TIME ZONE 'UTC') AT TIME ZONE 'Europe/Zurich' AS DATE)
    from sy_request
    

    【讨论】:

    • Danke sehr 为您快速回复!但是,我收到一个错误:ORA-30084:具有时区修饰符的日期时间主数据类型无效。你知道我怎样才能防止这种情况发生吗?
    • GMT_DATE_AND_TIME的数据类型是什么?是DATE 吗?在这种情况下,您首先必须对“TIMESTAMP WITH TIME ZONE”进行 CAST。
    • 老实说,我不确定 GMT_DATE_AND_TIME 是什么数据类型,但演员表起作用了。在时区“欧洲/苏黎世”选择强制转换(sy_sttime 作为带时区的时间戳),来自 sy_request 的 sy_sttime 创建这些记录:CAST 2014-11-10 20:01:08.000000 +01:00 SY_STTIME 11/10/2014 8:01 :08 PM 我可以让“cast-value”直接转到格式“11/10/2014 9:01:08 PM”并将时区添加到时间戳吗?
    • 你可以通过命令DESC sy_request;获取你的列的数据类型。您可以使用TO_CHAR 函数以任何格式显示它。请参阅Datetime Format Models 文档。但是不要将格式化的字符串插入您的日期列!
    • 那么数据类型是DATE。所以我想我想要做的是将一个格式化为 DATE 的字段,将其格式化为 TIMESTAMP,添加时区,然后将其格式化回 DATE?我对吗?喜欢:在时区“欧洲/苏黎世”选择 to_date(cast(sy_sttime as timestamp with time zone), sy_sttime from sy_request 这实际上不起作用。我想我在这里遗漏了一些东西......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-04-07
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多