在 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');
得到正确的数字。
我需要在 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');
得到正确的数字。