在SQL Developer中生成以毫秒为单位的总时间

时间:2016-10-04 21:21:39

标签: linux oracle time milliseconds

我需要复制linux命令" date +%s%3N"在SQL Developer中。我尝试了下面的代码示例,但它返回不同的值。我也做了广泛的搜索谷歌没有运气。

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命令返回类似于:

的内容

1475615656692870653

上面的代码示例返回类似于:

的内容

1475594089419116

即使在代码示例之前运行,date命令也会返回比代码示例更长且更大的数字。如果可能,最终解决方案将是Oracle中的直接实用程序。如果没有,可能在Oracle中调用date命令会起作用。

2 个答案:

答案 0 :(得分:0)

试试这个:

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)将以 Milli 秒返回Unix时间,根据您的问题,您不清楚是否要获得毫秒,微秒或甚至纳秒。但很明显如何将结果更改为所需的值。

此功能考虑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;

答案 1 :(得分:0)

我最后通过此链接http://www.orafaq.com/scripts/plsql/oscmd.txt中描述的方法使用oscommands。下面的解决方案是朝着正确方向迈出的一步,但是,我们制作的脚本的其他部分都遇到了问题。使用oscommands解决了我们所有的问题。使用链接中提到的方法,我只需输入

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

获取正确的号码。