在 SQL 开发人员中生成总时间(以毫秒为单位)

Generating Total Time in Milliseconds in SQL Developer

我需要在 SQL Developer 中复制 linux 命令 "date +%s%3N"。我已经尝试了下面的代码示例,但它 returns 具有不同的值。我也进行了广泛的搜索 Google 但没有成功。

select to_char((extract(day from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000
+ extract(hour from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000
+ extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000
+ extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000) * 1000) unix_time
from dual;

日期 +%s%3N 命令returns类似于:

1475615656692870653

而上面的代码示例 returns 类似于:

1475594089419116

日期命令 returns 比代码示例更长更大的数字,即使它比代码示例早 运行。如果可能的话,最终的解决方案是在 Oracle 中直接使用实用程序。如果没有,可能会在 Oracle 中调用 date 命令。

试试这个:

CREATE OR REPLACE FUNCTION GetUnixTime RETURN INTEGER IS
    dsInt INTERVAL DAY(9) TO SECOND;
    res NUMBER;
BEGIN

    dsInt := CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC';
    res:= EXTRACT(DAY FROM dsInt)*24*60*60 
        + EXTRACT(HOUR FROM dsInt)*60*60 
        + EXTRACT(MINUTE FROM dsInt)*60 
        + EXTRACT(SECOND FROM dsInt);
    RETURN ROUND(1000*res);
END GetUnixTime;

ROUND(1000*res) 将 return Unix 时间 Milliseconds,根据你的问题,不清楚你是否喜欢获得 Milliseconds,Microseconds 甚至纳秒。但是如何将结果更改为所需值是很明显的。

此函数会考虑您当地的时区和 Unix 纪元的时区(始终为 UTC)

如果你不喜欢一个函数,你当然可以在查询中写它:

SELECT 
    ROUND(EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*24*60*60 
        + EXTRACT(HOUR FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60*60 
        + EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60 
        + EXTRACT(SECOND FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC') 
    * 1000) AS unix_time
FROM dual;

我最终通过 link 此处 http://www.orafaq.com/scripts/plsql/oscmd.txt 中描述的方法使用了 oscommands。下面的解决方案是朝着正确方向迈出的一步,但是,我们制作的脚本的其他部分 运行 出现了问题。使用 oscommands 解决了我们所有的问题。使用 link 中提到的方法,我可以简单地输入

l_time := oscomm('/bin/date +%s%3N');

得到正确的数字。