Oracle:包含时区的epoch milleseconds到日期/时间

时间:2013-10-24 14:23:31

标签: oracle date time epoch zone

我是一名PL / SQL新手,他需要将unix epoch之后的milleseconds转换为 日期/时间。我可以转换为GMT日期/时间,但不知道如何调整 为时区。我很亲密,但不是那里。

我的输入是r_msg.OriginationTime,其值为1382552100277

这个

MpD NUMBER        := (1/24/60/60/1000);        -- Milleseconds per Day

DFmt24 VARCHAR2(21) := 'MM/DD/YYYY HH24:MI:SS';    -- Date format

TMPorig24        VARCHAR2(20);

. . .

TMPorig24 := TO_CHAR( DATE '1970-01-01' + MpD * r_msg.OriginationTime, DFmt24);

给出类似

的内容
10/23/2013 18:15:00

这正是我想要的,除非它是GMT。

    TimeZoneOffset VARCHAR(7);

    . . . 

    TimeZoneOffset := tz_offset('America/New_York' );

给出

-04:00

所以我只需要做一些像

这样的事情
TMPorig24 := TMPorig24 + TimeZoneOffset;

但我得到

ORA-06502: PL/SQL: numeric or value error: character to number conversion error

我尝试了几种变化,但没有任何效果。

任何帮助表示感谢。


谢谢,但我遇到了两个解决方案的问题。

无论时区如何,第一个解决方案都会打印相同的时间。 例如,它们打印相同的值。

TMPorig:= TO_CHAR(             FROM_TZ(CAST(日期'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'America / New_York'),'MM / DD / YYYY HH24:MI:SS “);

TMPorig2:= TO_CHAR(             FROM_TZ(CAST(日期'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'Pacific / Pago_Pago'),'MM / DD / YYYY HH24:MI:SS “);

第二个解决方案

TMPorig:= TO_CHAR(       日期'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime + INTERVAL'-04:00'小时分钟,'MM / DD / YYYY HH24:MI:SS');

给出

PLS-00166: bad format for date, time, timestamp or interval literal

切换,夏令时结束时'04:00'将出错。 我需要表达EST / EDT和GMT之间的时差。

** * ** * ** * 完美的工作 * ** * ** * ** * ** * *

TMPorig2:= TO_CHAR(     FROM_TZ(CAST(日期'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'UTC')       在时区'America / New_York','MM / DD / YYYY HH24:MI:SS');


1 个答案:

答案 0 :(得分:1)

修改:好的,请尝试使用此解决方案:

SELECT
  TO_CHAR (
    FROM_TZ (
      CAST (DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP),
      'UTC')
    AT TIME ZONE 'America/New_York',
  'MM/DD/YYYY HH24:MI:SS') val
FROM dual;

输出:

VAL               
-------------------
10/23/2013 14:15:00 

您必须将DATE强制转换为TIMESTAMP并使用FROM_TZ函数将TIMESTAMP转换为TIMESTAMP WITH TIME ZONE数据类型。时区参数可采用以下任一格式:America/New_York-04:00

SELECT
  TO_CHAR(
    FROM_TZ(
      CAST(DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP),
      'America/New_York'),
    'MM/DD/YYYY HH24:MI:SS')
FROM dual;

即如果您想拥有TIMESTAMP WITH TIME ZONE变量。如果要添加给定时区的偏移量,则可以使用:

SELECT
  TO_CHAR(
      DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 + INTERVAL '-04:00' HOUR TO MINUTE,
    'MM/DD/YYYY HH24:MI:SS') AS val
FROM dual;

输出:

VAL               
-------------------
10/23/2013 14:15:00