将大量数字转换为日期,在Oracle Sql中产生意外结果

ppcbkaq5  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(120)

我正在从一个RESTful服务中获取JSON主体。其中一个数据是Paid_at:1696484073(编号)。我要把这变成一次约会。
我试过了:

SELECT TO_timestamp( '1970-01-01', 'YYYY-MM-DD' ) + NUMTODSINTERVAL( nvl(l_payment_date,0), 'SECOND' )
into l_payment_date_trans 
FROM DUAL;

10/05/23返回,这是不正确的

l_payment_date_str := to_char(l_payment_date);
l_payment_date_trans := TO_DATE(to_char(l_payment_date_str), 'YYYY-MM-DD');

不起作用

SELECT TO_DATE(to_char(l_payment_date_str), 'YYYY-MM-DD')
into l_payment_date_trans 
FROM DUAL;

03/02/15我不认为这是正确的。
如何将该数字('l_payment_date')转换为日期并将值赋给l_payment_date_transs?

zvms9eto

zvms9eto1#

您不需要使用SQL,可以在PL/SQL中完成所有操作。
此外,epoch时间是从UTC时区的午夜1970-01-01开始,因此您需要使用TIMESTAMP WITH TIME ZONE

DECLARE
  l_payment_date       NUMBER := 1696484073;
  l_payment_date_trans TIMESTAMP(0) WITH TIME ZONE;
BEGIN
  l_payment_date_trans := TIMESTAMP '1970-01-01 00:00:00 UTC'
                            + INTERVAL '1' SECOND * l_payment_date;
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_payment_date_trans, 'YYYY-MM-DD HH24:MI:SS TZR'));
END;
/

其输出:

2023-10-05 05:34:33 UTC

除了不在UTC时区之外,你的第一个解决方案是正确的:

DECLARE
  l_payment_date       NUMBER := 1696484073;
  l_payment_date_trans TIMESTAMP(0);
BEGIN
  l_payment_date_trans := TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD')
                            + NUMTODSINTERVAL(NVL(l_payment_date,0), 'SECOND');
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_payment_date_trans, 'YYYY-MM-DD HH24:MI:SS'));
END;
/

其输出:

2023-10-05 05:34:33

fiddle

uhry853o

uhry853o2#

为什么你认为你得到的值不对?因为你没看到时间成分?好吧,也许这是关于你的 * 客户端 *,它目前被设置为只显示日期值。如果你正确地设置了它(如下面的例子所示),你会发现它实际上是正确的。

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> alter session set nls_timestamp_format = 'dd.mm.yyyy hh24:mi:ss.ff6';

Session altered.

SQL> select date '1970-01-01' + (&&your_value / 86400 ) result_date,
  2         --
  3         timestamp '1970-01-01 00:00:00' + numtodsinterval (&your_value, 'second' ) result_timestamp
  4  from dual;
Enter value for your_value: 1696484073

RESULT_DATE         RESULT_TIMESTAMP
------------------- --------------------------------------------------
05.10.2023 05:34:33 05.10.2023 05:34:33.000000

SQL>

相关问题