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

我是一名PL / SQL新手,他们需要在unix时代之后将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

这正是我想要的,除了格林尼治标准时间。

这个

    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(DATE'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(DATE'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(DATE'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(DATE'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'UTC')AT TIME ZONE'America / New_York', 'MM / DD / YYYY HH24:MI:SS');



编辑 :好的,试试这个解决方案:

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 

您必须将DATETIMESTAMP并使用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 
链接地址: http://www.djcxy.com/p/36913.html

上一篇: Oracle: epoch milleseconds to date/time with time zone included

下一篇: Wrong date format C#, Oracle