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
您必须将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链接地址: http://www.djcxy.com/p/36913.html
上一篇: Oracle: epoch milleseconds to date/time with time zone included