oracle systimestamp (sysdate) 到毫秒
Posted
技术标签:
【中文标题】oracle systimestamp (sysdate) 到毫秒【英文标题】:oracle systimestamp (sysdate) to milliseconds 【发布时间】:2011-11-01 03:45:16 【问题描述】:您能否提供存储函数的实现,以毫秒为单位获取当前systimestamp
。
我可以使用的东西像
select current_time_ms from dual;
并获取当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异(以毫秒为单位)。
谢谢。
【问题讨论】:
看***.com/questions/5881235/…。有更短更快的答案。 【参考方案1】:我所知道的最好的事情是:
select 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 unix_time
from dual;
我不太确定您对时区有什么要求。您可能需要对此进行细微调整。
【讨论】:
Tt 不考虑闰年。 精确到秒,而不是毫秒【参考方案2】:AFAIK,没有直接的方法可以实现这一点(除了手动编写冗长的 SQL 函数)。
为什么你特别需要这个?
您可以使用存储的 Java 函数,然后使用 Java 提供的 System.getCurrentMillis() 返回一个从 1.1.1970 到现在的毫秒值。
【讨论】:
-1,@Codo 的回答是直接的,而不是为它编写一个 java 函数和 pl/sql 包装器。 同意,如果你可以在 SQL 中做到这一点,那么你应该这样做。 这是正确的做法。其他答案有一些细微的错误,因为没有考虑闰年或闰秒。 您不必编写Java代码来调用System.getCurrentMillis()
,因为您可以直接调用后者。看我的回答。【参考方案3】:
与数据库时区无关
以毫秒为单位
在 XE 中工作
函数 current_time_ms
退货号码
是
out_result 编号;
开始
选择提取(天从(sys_extract_utc(systimestamp)-to_timestamp('1970-01-01','YYYY-MM-DD')))* 86400000
+ to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3'))
进入 out_result
从双;
返回输出结果;
结束 current_time_ms;
【讨论】:
如果会话时区恰好与系统时区不同,则在午夜左右调用时,这可能会在 24 小时前返回值关闭(取决于两个时区的关联方式之前或之后)。您可以使用ALTER SESSION SET TIME_ZONE = '+ 08:00'
或类似的方法轻松测试。修复似乎很简单:在您的表达式中将 from(systimestamp...
替换为 from(sys_extract_utc(systimestamp)...
。
我写了“纯 Java”版本(见我的回答)。令我惊讶的是,在非常简单的测试中,Java 版本比 PL/SQL 版本快得多。【参考方案4】:
下面的代码给出了以毫秒为单位的差异:
with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
extract(hour from diff) * 3600000+
extract(minute from diff) * 60000 +
extract(second from diff) * 1000
dif
from t
为了将毫秒转换为小时、分钟、秒,请根据需要修改并使用以下查询:
with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
extract(hour from diff) * 3600000+
extract(minute from diff) * 60000 +
extract(second from diff) * 1000
dif,
(to_char (to_date(round(( extract(day from diff) * 24 * 3600000+
extract(hour from diff) * 3600000+
extract(minute from diff) * 60000 +
extract(second from diff) * 1000)/1000), 'SSSSS' ), 'HH24"Hrs" MI"Min" SS"Sec"')) timeval
from t
【讨论】:
【参考方案5】:添加到@Mykhaylo Adamovych 的答案(看起来是正确的!)这里是使用 Oracle Java 支持的更直接的方法(即不在 XE 和 AWS RDS 中)。不太便携(以防万一),但在 my 测试中似乎更快。
CREATE or replace FUNCTION current_java_timestamp RETURN number
AS LANGUAGE JAVA NAME 'java.lang.System.currentTimeMillis() return java.lang.Long';
/
【讨论】:
【参考方案6】:SELECT to_char(sysdate, 'HH24:MI:SS'), to_char(systimestamp, 'HH24:MI:SS.FF6') FROM dual
【讨论】:
【参考方案7】:我已经发布了here 一些将时间戳转换为纳秒和将纳秒转换为时间戳的方法。这些方法不受时区影响,精度为纳秒级。
您只需将其调整为毫秒而不是纳秒。
SELECT (EXTRACT(DAY FROM (
SYSTIMESTAMP --Replace line with desired timestamp --Maximum value: TIMESTAMP '3871-04-29 10:39:59.999999999 UTC'
- TIMESTAMP '1970-01-01 00:00:00 UTC') * 24 * 60) * 60 + EXTRACT(SECOND FROM
SYSTIMESTAMP --Replace line with desired timestamp
)) * 1000 AS MILLIS FROM DUAL;
MILLIS
1598434427263.027
【讨论】:
以上是关于oracle systimestamp (sysdate) 到毫秒的主要内容,如果未能解决你的问题,请参考以下文章