当前位置: 首页 > 知识库问答 >
问题:

Oracle:包含时区的纪元毫秒到日期/时间

洪涵亮
2023-03-14

我是一个PL/SQL新手,需要将unix时代以来的千秒转换为日期/时间。我可以转换为GMT日期/时间,但不知道如何调整时区。我很接近,但不太接近。

我的输入是r\u msg。OriginationTime,其值类似于138255210277

这个

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:=至\u CHAR(从\u TZ(演员阵容(日期‘1970-01-01’(1/24/60/60/1000)*r\u消息。“起始时间(作为时间戳)”,“美国/纽约”),“MM/DD/YYYY HH24:MI:SS”);

TMPorig2:=至\u CHAR(自\u TZ(演员阵容(日期‘1970-01-01’(1/24/60/60/1000)*r\u消息。“起始时间(作为时间戳)”,“太平洋/帕果岛”),“MM/DD/YYYY HH24:MI:SS”);

第二种解决方案

TMPorig:=TO_CHAR(DATE'1970-01-01'(1/24/60/60/1000)*r_msg。发起时间间隔'-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:=至\u CHAR(自\u TZ(演员阵容(日期‘1970-01-01’(1/24/60/60/1000)*r\u消息。“美国/纽约”、“YYYY年/月/日HH24:MI:SS”时区的“起始时间”(时间戳)、“UTC”);

共有1个答案

苍烨然
2023-03-14

编辑:确定,改为尝试此解决方案:

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 AND 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;

也就是说,如果您想要有一个带有时区变量的时间戳。如果要添加与给定时区的偏移,则可以使用:

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 
 类似资料:
  • 问题内容: 在pandas数据框中有一个datetime列,其值如下: 我想知道如何舍入这些值,摆脱毫秒,仅将日期,小时,分钟和00表示为秒,如下所示: 问题答案: 使用与用于分钟设置: 我想将时间值更改为下一个值:

  • 上下文是,我们的产品中有一个现有的应用程序,它生成并向现有的oracle过程发送纪元号&反之亦然。它在该过程中使用如下内容 当我尝试这些查询时,它对我也适用于Oracle10g服务器(如果有关系的话,还有Oracle sql Developer4.x)。 在现有的过程中,要求将值保存为日期本身(时间组件与日期无关),但是在新的要求中,我必须将unix EPOCH值转换为日期时间(小时/分钟/秒级别

  • 我试图编写一个SQL表达式,该表达式将在特定时区将unix历元(1970/1/1以来的秒)转换为本地时间,并从中提取小时值。在研究了这段时间的解决方案后,我仍然不确定如何处理时区。注意,我尽量避免使用NEW_TIME()函数,因为它只使用时区缩略词的有限子集,而不使用全时区名称。 结果是 结果有几个问题 第1列:从时间戳开始,该值比使用日期关闭1小时 第2列:在America/los_Angele

  • 目前我正在逐行读取数据文件。每行都有一个时间戳,格式为dd/MM/yyyy HH: mm: ss“我需要将其转换为自纪元以来的毫秒。我尝试了两种方法 1个 2. 在分析之后,我发现方法一的成本非常高,而方法二的成本比第一种低一些,但仍然很高。第一个需要大约1600ms的CPU时间,第二个需要1100ms的CPU时间。 问题- 1个 2. 谢谢 ** ** 好啊在这里添加更多细节。测试运行了1000

  • 问题内容: 我想以毫秒为单位,仅包含年,月和日期的当前日期。但是当我使用此代码时: 我仍然以毫秒为单位获取时间。我怎样才能解决这个问题? 问题答案: 请注意日历的时区。

  • 我将MSSTAMP作为Oracle中的“毫秒时间戳”,格式:1483228800000。如何将该毫秒时间戳转换为日期格式“YYYY-MM”,以便计算前几年每月完成的行数。 我已经尝试了TO_DATE、CAST、TO_CHAR的不同变体——但我无法做到这一点。