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) 到毫秒的主要内容,如果未能解决你的问题,请参考以下文章

怎么在Oracle中将时间戳转化为日期格式

ORACLE——日期时间格式化参数详解 之三

如何以特定时间在 Oracle 中获取昨天的日期时间?

oracle中怎么截取timestamp字段的时分秒?

Oracle SQL 求算时间加减问题

Oracle过程语句