我是一名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');
答案 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