oracle Convert timestamp to Epoch date in pl/sql in stored procedure [closed]

yuvru6vn  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(172)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

19天前关闭。
Improve this question
我想将时间戳转换为纪元日期。

SELECT (CAST(timestamp '2022-10-13 00:00:00' AT TIME ZONE 'UTC' AS date) - date '1970-01-01') * 86400 * 1000 EPOCH_FROM_DATE  
FROM DUAL;

这解决了我的目的。
但我希望这样:

SELECT (CAST(timestamp (to_char(sysdate, 'YYYY-MM-DD') || ' 00:00:00') AT TIME ZONE 'UTC' AS date) - date '1970-01-01') * 86400 * 1000 EPOCH_FROM_DATE  
FROM DUAL;

出现错误!

c3frrgcw

c3frrgcw1#

如果您希望:

  • UTC时区中从当天午夜开始的历元,然后使用SYSTIMESTAMP并将其转换为UTC时区,然后使用TRUNC
  • 然后,从本地时区的午夜开始的历元使用X1 M3 N1 X,并在转换为X1 M5 N1 X之前转换为X1 M4 N1 X,然后转换回X1 M6 N1 X:
SELECT (
         TRUNC(SYSTIMESTAMP AT TIME ZONE 'UTC')
         - date '1970-01-01'
       ) * 86400 * 1000 AS EPOCH_MIDNIGHT_UTC,
       (
         CAST(
           CAST(TRUNC(SYSDATE) AS TIMESTAMP WITH TIME ZONE)
           AT TIME ZONE 'UTC'
           AS DATE
         )
         - date '1970-01-01'
       ) * 86400 * 1000 AS EPOCH_MIDNIGHT_CURRENT_TZ
FROM   DUAL;

输出:
| 世界协调时午夜纪元|终点_午夜_当前_TZ|
| - -|- -|
| 1665705600000美元|小行星1665702000000|
fiddle

5hcedyr0

5hcedyr02#

所以这部分就在这里:

timestamp '2022-10-13 00:00:00'

是一个 timestamp literal,而第二部分必须是字符串literal。您不能动态创建它。
您应该改用to_timestamp()函数:

SELECT (CAST(to_timestamp(to_char(sysdate, 'YYYY-MM-DD') || ' 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AT TIME ZONE 'UTC' AS date) - date '1970-01-01') * 86400 * 1000 EPOCH_FROM_DATE  
FROM DUAL;

您可以通过省略时间(假定为午夜)来使其稍短一些:

SELECT (CAST(to_timestamp(to_char(sysdate, 'YYYY-MM-DD'), 'yyyy-mm-dd') AT TIME ZONE 'UTC' AS date) - date '1970-01-01') * 86400 * 1000 EPOCH_FROM_DATE  
FROM DUAL;

相关问题