如何在Oracle SQL中获得自1970 UTC以来的毫秒时间戳?
我有一个表,其中一列的类型为如何在Oracle SQL中获得自1970 UTC以来的毫秒时间戳?,sql,oracle,Sql,Oracle,我有一个表,其中一列的类型为TIMESTAMP(6) 如何获取自UTC 1970年以来列数据的毫秒数?试试这个 select (cast(your_column as date) - date '1970-01-01')*24*60*60 from your_table; 考虑到闰秒: Oracle 11g R2架构设置: CREATE FUNCTION milliseconds_Since_1970( datetime TIMESTAMP ) RETURN NUMBER DETERMI
TIMESTAMP(6)
如何获取自UTC 1970年以来列数据的毫秒数?试试这个
select (cast(your_column as date) - date '1970-01-01')*24*60*60 from your_table;
考虑到闰秒: Oracle 11g R2架构设置:
CREATE FUNCTION milliseconds_Since_1970(
datetime TIMESTAMP
) RETURN NUMBER DETERMINISTIC
AS
diff INTERVAL DAY(9) TO SECOND(9) := datetime - TIMESTAMP '1970-01-01 00:00:00';
millis NUMBER(38,0) := EXTRACT( DAY FROM diff ) * 24 * 60 * 60 * 1000
+ EXTRACT( HOUR FROM diff ) * 60 * 60 * 1000
+ EXTRACT( MINUTE FROM diff ) * 60 * 1000
+ EXTRACT( SECOND FROM diff ) * 1000;
leap_seconds SYS.ODCIDATELIST := SYS.ODCIDATELIST(
DATE '1972-07-01',
DATE '1973-01-01',
DATE '1974-01-01',
DATE '1975-01-01',
DATE '1976-01-01',
DATE '1977-01-01',
DATE '1978-01-01',
DATE '1979-01-01',
DATE '1980-01-01',
DATE '1981-07-01',
DATE '1982-07-01',
DATE '1983-07-01',
DATE '1985-07-01',
DATE '1988-01-01',
DATE '1990-01-01',
DATE '1991-01-01',
DATE '1992-07-01',
DATE '1993-07-01',
DATE '1994-07-01',
DATE '1996-01-01',
DATE '1997-07-01',
DATE '1999-01-01',
DATE '2006-01-01',
DATE '2009-01-01',
DATE '2012-07-01',
DATE '2015-07-01'
);
BEGIN
FOR i IN 1 .. leap_seconds.COUNT LOOP
IF datetime < leap_seconds(i) THEN
RETURN millis;
END IF;
millis := millis + 1000;
END LOOP;
RETURN millis;
END;
//
SELECT milliseconds_Since_1970( TIMESTAMP '1970-01-01 00:00:00' ) AS "MS 1970-01-01 00:00:00",
milliseconds_Since_1970( TIMESTAMP '1970-01-01 00:01:00' ) AS "MS 1970-01-01 00:01:00",
milliseconds_Since_1970( TIMESTAMP '1972-06-30 23:59:59' ) AS "MS 1972-06-30 23:59:59",
milliseconds_Since_1970( TIMESTAMP '1972-07-01 00:00:00' ) AS "MS 1972-07-01 00:00:00"
FROM DUAL
| MS 1970-01-01 00:00:00 | MS 1970-01-01 00:01:00 | MS 1972-06-30 23:59:59 | MS 1972-07-01 00:00:00 |
|------------------------|------------------------|------------------------|------------------------|
| 0 | 60000 | 78796799000 | 78796801000 |
:
CREATE FUNCTION milliseconds_Since_1970(
datetime TIMESTAMP
) RETURN NUMBER DETERMINISTIC
AS
diff INTERVAL DAY(9) TO SECOND(9) := datetime - TIMESTAMP '1970-01-01 00:00:00';
millis NUMBER(38,0) := EXTRACT( DAY FROM diff ) * 24 * 60 * 60 * 1000
+ EXTRACT( HOUR FROM diff ) * 60 * 60 * 1000
+ EXTRACT( MINUTE FROM diff ) * 60 * 1000
+ EXTRACT( SECOND FROM diff ) * 1000;
leap_seconds SYS.ODCIDATELIST := SYS.ODCIDATELIST(
DATE '1972-07-01',
DATE '1973-01-01',
DATE '1974-01-01',
DATE '1975-01-01',
DATE '1976-01-01',
DATE '1977-01-01',
DATE '1978-01-01',
DATE '1979-01-01',
DATE '1980-01-01',
DATE '1981-07-01',
DATE '1982-07-01',
DATE '1983-07-01',
DATE '1985-07-01',
DATE '1988-01-01',
DATE '1990-01-01',
DATE '1991-01-01',
DATE '1992-07-01',
DATE '1993-07-01',
DATE '1994-07-01',
DATE '1996-01-01',
DATE '1997-07-01',
DATE '1999-01-01',
DATE '2006-01-01',
DATE '2009-01-01',
DATE '2012-07-01',
DATE '2015-07-01'
);
BEGIN
FOR i IN 1 .. leap_seconds.COUNT LOOP
IF datetime < leap_seconds(i) THEN
RETURN millis;
END IF;
millis := millis + 1000;
END LOOP;
RETURN millis;
END;
//
SELECT milliseconds_Since_1970( TIMESTAMP '1970-01-01 00:00:00' ) AS "MS 1970-01-01 00:00:00",
milliseconds_Since_1970( TIMESTAMP '1970-01-01 00:01:00' ) AS "MS 1970-01-01 00:01:00",
milliseconds_Since_1970( TIMESTAMP '1972-06-30 23:59:59' ) AS "MS 1972-06-30 23:59:59",
milliseconds_Since_1970( TIMESTAMP '1972-07-01 00:00:00' ) AS "MS 1972-07-01 00:00:00"
FROM DUAL
| MS 1970-01-01 00:00:00 | MS 1970-01-01 00:01:00 | MS 1972-06-30 23:59:59 | MS 1972-07-01 00:00:00 |
|------------------------|------------------------|------------------------|------------------------|
| 0 | 60000 | 78796799000 | 78796801000 |
我已经发布了一些将时间戳转换为纳秒以及将纳秒转换为时间戳的方法。这些方法不受时区的影响,精度为纳秒
您只需要将其调整为毫秒而不是纳秒
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
你想考虑闰秒吗。请注意,如果您的时间戳与客户端的时区不同,您可能需要指定它是什么。为此,请将
MY_TS
替换为FROM_TZ(MY_TS,'PST')
谢谢您的回复。我不得不说,在与Oracle合作了很短一段时间后,这是我见过的最不友好的数据库之一。真正令人困惑的是,这并没有包括在系统实用程序功能中。这是自1970年以来的秒,而不是毫秒。以毫秒为单位:SELECT(CAST(SYSTIMESTAMP作为日期)-日期'1970-01-01')*24*60*60*1000+MOD(提取(从SYSTIMESTAMP中的第二个),1*1000从DUAL重新格式化以前的注释:SELECT((TRUNC(当前日期,'MI')-日期'1970-01-01')*86400+提取(从当前时间戳中的第二个))*1000从DUAL重新格式化