`
juji1010
  • 浏览: 117095 次
社区版块
存档分类
最新评论

请您先登录,才能继续操作

Oracle 毫秒时间戳

 
阅读更多

其实很早以前就经常碰到这个问题,就是得到自1970年1月1日以来的秒数。

这个问题很容易解决:

SQL> SELECT (SYSDATE - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400 FROM DUAL;

(SYSDATE-TO_DATE('1970-1-18','YYYY-MM-DDHH24'))*86400
-----------------------------------------------------
1167040878

用当前的时间减去1970年1月1日8时,得到的天数乘以24小时乘以3600秒,得到的结果就是系统时间戳。这里用8时的原因时系统所处时区为东8区。

而同事提的需求是得到这个毫秒值,而且要相对准确的,将上面的结果直接乘1000是不行的。

而且同事已经通过JAVA外部过程的方式实现了,方法类似于:

SQL> create or replace and compile java source named "getcurrenttime" as
2 public class getcurrenttime extends Object
3 {
4 public static long getcurrenttime()
5 {
6 return System.currentTimeMillis();
7 }
8 }
9 /

Java 已创建。

SQL> CREATE OR REPLACE FUNCTION F_GETCURRENTTIME_JAVA RETURN NUMBER AS
2 LANGUAGE JAVA NAME 'getcurrenttime.getcurrenttime() return long';
3 /

函数已创建。

SQL> SET NUMW 14
SQL> SELECT F_GETCURRENTTIME_JAVA FROM DUAL;

F_GETCURRENTTIME_JAVA
---------------------
1167041159125

然后问我在Oracle中有没有实现的方法。

我首先想到的9i新增加的TIMESTAMP数据类型。但是利用TIMESTAMP类型相减后得到的不是NUMBER类型的日期相差的天数,而是INTERVAL DAY TO SECOND类型,将这个类型转化为毫秒值需要使用EXTRACT函数,写了半天,简化后的SQL为:

SQL> WITH TIME AS
2 (SELECT SYSTIMESTAMP(3) - TO_TIMESTAMP('1970-1-1 8', 'YYYY-MM-DD HH24') T FROM DUAL)
3 SELECT EXTRACT(DAY FROM T) * 86400000
4 + EXTRACT(HOUR FROM T) * 3600000
5 + EXTRACT(MINUTE FROM T) * 60000
6 + EXTRACT(SECOND FROM T) * 1000 AS MILLIONS
7 FROM TIME;

MILLIONS
--------------
1167041521843

这个结果和JAVA的实现相比就太复杂了,后来想到可以利用前面计算DATE类型的结果,于是,SQL语句改写为:

SQL> SELECT (TRUNC(SYSDATE, 'MI') - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000
2 + EXTRACT(SECOND FROM SYSTIMESTAMP(3)) * 1000 AS MILLIONS
3 FROM DUAL;

MILLIONS
--------------
1167041665265

写完之后仍然觉得过于复杂,仔细看了一下,发现根本没有必要使用EXTRACT函数,最终SQL语句改写为:

SQL> SELECT (SYSDATE - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000
2 + TO_NUMBER(TO_CHAR(SYSTIMESTAMP(3), 'FF')) AS MILLIONS
3 FROM DUAL;

MILLIONS
--------------
1167041794765

其实就是利用了DATE类型的计算结果,将其扩大1000倍之后,加上了SYSTIMESTAMP中的毫秒部分。

最终这个写法的复杂程度已经是可以接受的了,与建立JAVA外部过程比较,使用这个方法似乎还要简单一些。

分享到:
评论

相关推荐

    java 获取指定日期(带毫秒)13位时间戳

    java 获取指定日期(带毫秒)的 13位时间戳 ,获取当前时间的时间戳 一句话就可以System.currentTimeMillis();

    使用oracle计算系统当前时间的毫秒数

    通过这种方式,可以确保Oracle数据库中获取到的毫秒数与Java程序中处理的时间戳保持一致。 #### 总结 本文详细介绍了在Oracle数据库中计算系统当前时间的毫秒数的方法。虽然Oracle本身并没有直接提供获取毫秒数的...

    oracle数据库实现获取时间戳的无参函数

    在Oracle数据库中,时间戳(Timestamp)是一种用来记录精确到秒甚至毫秒的日期和时间数据类型。在处理与时间相关的业务逻辑时,有时我们需要获取当前时间的时间戳,以便进行各种计算或比较。本文将详细介绍如何在...

    ORACLE 毫秒与日期的相互转换示例

    总结起来,Oracle中毫秒与日期的转换主要通过数学运算结合日期函数来完成,具体操作包括将毫秒数除以一天的毫秒数再加日期,或计算日期差后乘以毫秒数。理解并熟练运用这些转换技巧,能帮助我们在处理时间相关的...

    Oracle计算时间差为毫秒的实现代码

    在提供的代码中,作者采用了一种巧妙的方法来计算两个时间戳之间的毫秒差。首先,他们将两个TIMESTAMP值通过`+0`操作转换为数值,这可以将TIMESTAMP类型转换为内部的浮点数表示,其中包含了日期和时间信息。然后,...

    oracle获取当前时间,精确到毫秒并指定精确位数的实现方法

    例如,表`ct_cdr_comparison`中的`DATTCDRCOMPARISONGUID`字段就是`TIMESTAMP(9)`类型,可以存储带有9位小数的毫秒时间戳。如果在查询时未显示毫秒部分,可能是因为NLS_timestamp_format环境变量没有设置正确。可以...

    Oracle中通过触发器来追踪用户的活动

    4. 登录时间:精确到毫秒的Oracle时间戳,记录用户登录的具体时间。 5. 注销时间:同样精确到毫秒的Oracle时间戳,记录用户注销的时间。 6. 最后程序:用户在注销时执行的最后一个程序名称。 7. 最后活动:用户在...

    数据库中日期时间用法

    `Current_timestamp`函数返回当前会话时区中的当前日期和时间,包括毫秒级精度,这对于精确的时间戳记录至关重要。 ### 八、Dbtimezone:获取数据库服务器的时区 `Dbtimezone`函数返回数据库服务器所在的时区,这...

    oracle时间和秒之间相互转换

    除了基本的转换外,还可以根据需要进一步处理这些时间戳或毫秒值。例如,如果你有一个变量存储了毫秒值,你可以通过以下方式将其转换为日期: ```sql SELECT TO_DATE('1970-01-01', 'YYYY-MM-DD') + 前面获取的毫秒...

    Oracle实用教程_04章_Oracle数据类型和函数[整理].pdf

    TIMESTAMP 型数据存储的是时间戳数据,可以精确到秒或毫秒。 4. 其它类型:包括 RAW、LONG RAW、LOB、FILE、XML TYPE 等。 RAW 型数据存储的是二进制数据,可以是图片、音频、视频等。 LONG RAW 型数据存储的...

    oracle中TIMESTAMP与DATE比较

    这意味着在比较两个时间戳时,即使它们看起来完全相同,Oracle仍然能够区分出哪一个是先发生的,这是`DATE`类型所无法做到的。 ### `DATE`与`TIMESTAMP`的转换与使用 尽管`DATE`和`TIMESTAMP`类型在功能上有所重叠...

    oracle --timestamp

    根据提供的标题、描述、标签及部分内容,我们可以了解到这段文本主要涉及Oracle数据库中处理时间戳(`TIMESTAMP`)的相关操作。接下来将详细解释这些内容所包含的关键知识点。 ### 关键知识点解析 #### 1. `...

    在oracle中插入当前时间

    如果需要在应用程序中生成时间戳并插入到Oracle数据库中,则可以使用Java编程语言来实现。这种方法的好处是可以更好地控制时间格式和时区设置等细节。 **示例 Java 代码:** ```java import java.sql.Timestamp; ...

    oracle 日期转换相关sql

    Oracle 当前时间戳 - 获取当前时间戳并保留小数点后 5 位: `SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL` - 获取当前时间戳的分钟和秒,并指定精度为 9: `SELECT TO_CHAR...

    oracle学习文档

    - `TIMESTAMP`类型: 存储精确到毫秒的时间戳。 - `SYSDATE`: 当前系统日期。 - `SYSTIMESTAMP`: 当前系统时间戳。 - `TO_DATE`和`TO_CHAR`: 日期格式转换。 - `LAST_DAY`: 返回当前月份的最后一天。 - `ADD_...

    在数据库里将毫秒转换成date格式的方法

    总的来说,处理毫秒时间戳与日期格式的转换是数据库操作中的常见需求。无论是MySQL还是Oracle,都有相应的解决方案。理解这些转换方法对于数据库开发者来说至关重要,能够帮助他们更好地管理和展示时间相关的数据,...

    Oracle PLSQL程序设计

    - `TIMESTAMP`:存储精确到毫秒的时间戳。 - **布尔数据类型**:仅有一种类型`BOOLEAN`,用于存储逻辑值`TRUE`、`FALSE`和`NULL`,但不支持直接存储到数据库表中。 - **LOB类型**:用于存储大型对象数据,如文本、...

    oracle日期操作举例

    在某些情况下,我们可能需要获取更精确的时间戳。 **1. 获取当前时间到毫秒级** ```sql SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL; ``` 此查询返回当前时间,精度到毫秒。 **...

    Oracle中TIMESTAMP的几种类型介绍与实例

    然后向表中插入当前系统时间,提交更改,并查看各种时间戳类型在不同时区下的表现,通过对比数据库和会话时区,理解各种类型的特点。 总结来说,Oracle 中的 `TIMESTAMP` 类型提供了多种方式来处理日期和时间,...

Global site tag (gtag.js) - Google Analytics