请您先登录,才能继续操作
其实很早以前就经常碰到这个问题,就是得到自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外部过程比较,使用这个方法似乎还要简单一些。
发表评论
-
查看当前Session SQL
2014-07-08 11:51 1092SELECT (SELECT listagg(b.sql_te ... -
CLOB列 XML信息查看
2014-05-28 10:28 1028--使用该SQL查询节点情况 SELECT * FROM ... -
【转】ORACLE 临时表空间使用率过高的原因及解决方案
2012-12-25 15:24 1022http://www.cnblogs.com/wonder31 ... -
oracle:获取session的IP地址
2012-10-20 02:38 4311方法1 创建触发器: create orreplace ... -
Oracle ora-01002
2012-08-11 02:43 28957ORA-01002:fetch超出序列 ... -
提高Oracle SQL的执行效率的3个方案
2012-08-08 00:57 1005如果你想要提高Oracle SQL ... -
Oracle STA
2012-08-06 11:32 0第一步:创建优化任务 ... -
Oracle SQL小技巧
2012-08-06 11:21 01.两个字段可空的判断相等,用decode判断。 例子:d ... -
自动工作负载库(Automatic Workload Repository,AWR)
2012-07-23 22:45 1430自动工作负载库(Automatic Workload Repo ... -
orace的隔离级别
2012-07-21 01:06 1107隔离级别(isoation eve) 隔离级别定义了事务与 ... -
Oracle SQLID 与 Hash_value 之间的相互转化
2012-07-20 00:55 4720一、什么是SQLID SQLID是根据SQL 文本,经过 ... -
Oracle优化器和索引原
2012-07-13 00:34 1283Oracle优化器和索引原理 ============ ... -
Oracle优化器的RBO和CBO方式
2012-07-13 00:25 2405[/size]Or[size=large][size=smal ... -
Oracle 优化器详解
2012-07-13 00:18 1357一、优化器基本知识 Oracle在执行一个SQL之前,首先 ... -
SQL中使用WITH AS提高性能
2012-07-05 23:30 1256摘要:本文结合笔者实 ... -
Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题
2012-07-01 23:46 2139最近开始接触Oracle了,接触的越多越感受到自己的渺小!(o ... -
Oracle表连接操作——Hash Join(哈希连接
2012-05-20 17:05 0连接 http://space.itpub.net/?uid ... -
Oracle hash join
2012-05-20 17:00 956hash join是oracle里面一个 ... -
转--一次HASH JOIN 临时表空间不足的分析和优化思路
2012-05-20 15:36 4558最近遇到一个语句, 只要一执行这个语句就会出现报错临时表空间 ... -
SQL*PLUS SET 变量
2012-05-02 22:46 882SQL*PLUS SET变量 SQL*PLUS维护系 ...
相关推荐
java 获取指定日期(带毫秒)的 13位时间戳 ,获取当前时间的时间戳 一句话就可以System.currentTimeMillis();
通过这种方式,可以确保Oracle数据库中获取到的毫秒数与Java程序中处理的时间戳保持一致。 #### 总结 本文详细介绍了在Oracle数据库中计算系统当前时间的毫秒数的方法。虽然Oracle本身并没有直接提供获取毫秒数的...
在Oracle数据库中,时间戳(Timestamp)是一种用来记录精确到秒甚至毫秒的日期和时间数据类型。在处理与时间相关的业务逻辑时,有时我们需要获取当前时间的时间戳,以便进行各种计算或比较。本文将详细介绍如何在...
总结起来,Oracle中毫秒与日期的转换主要通过数学运算结合日期函数来完成,具体操作包括将毫秒数除以一天的毫秒数再加日期,或计算日期差后乘以毫秒数。理解并熟练运用这些转换技巧,能帮助我们在处理时间相关的...
在提供的代码中,作者采用了一种巧妙的方法来计算两个时间戳之间的毫秒差。首先,他们将两个TIMESTAMP值通过`+0`操作转换为数值,这可以将TIMESTAMP类型转换为内部的浮点数表示,其中包含了日期和时间信息。然后,...
例如,表`ct_cdr_comparison`中的`DATTCDRCOMPARISONGUID`字段就是`TIMESTAMP(9)`类型,可以存储带有9位小数的毫秒时间戳。如果在查询时未显示毫秒部分,可能是因为NLS_timestamp_format环境变量没有设置正确。可以...
4. 登录时间:精确到毫秒的Oracle时间戳,记录用户登录的具体时间。 5. 注销时间:同样精确到毫秒的Oracle时间戳,记录用户注销的时间。 6. 最后程序:用户在注销时执行的最后一个程序名称。 7. 最后活动:用户在...
`Current_timestamp`函数返回当前会话时区中的当前日期和时间,包括毫秒级精度,这对于精确的时间戳记录至关重要。 ### 八、Dbtimezone:获取数据库服务器的时区 `Dbtimezone`函数返回数据库服务器所在的时区,这...
除了基本的转换外,还可以根据需要进一步处理这些时间戳或毫秒值。例如,如果你有一个变量存储了毫秒值,你可以通过以下方式将其转换为日期: ```sql SELECT TO_DATE('1970-01-01', 'YYYY-MM-DD') + 前面获取的毫秒...
TIMESTAMP 型数据存储的是时间戳数据,可以精确到秒或毫秒。 4. 其它类型:包括 RAW、LONG RAW、LOB、FILE、XML TYPE 等。 RAW 型数据存储的是二进制数据,可以是图片、音频、视频等。 LONG RAW 型数据存储的...
这意味着在比较两个时间戳时,即使它们看起来完全相同,Oracle仍然能够区分出哪一个是先发生的,这是`DATE`类型所无法做到的。 ### `DATE`与`TIMESTAMP`的转换与使用 尽管`DATE`和`TIMESTAMP`类型在功能上有所重叠...
根据提供的标题、描述、标签及部分内容,我们可以了解到这段文本主要涉及Oracle数据库中处理时间戳(`TIMESTAMP`)的相关操作。接下来将详细解释这些内容所包含的关键知识点。 ### 关键知识点解析 #### 1. `...
如果需要在应用程序中生成时间戳并插入到Oracle数据库中,则可以使用Java编程语言来实现。这种方法的好处是可以更好地控制时间格式和时区设置等细节。 **示例 Java 代码:** ```java import java.sql.Timestamp; ...
Oracle 当前时间戳 - 获取当前时间戳并保留小数点后 5 位: `SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL` - 获取当前时间戳的分钟和秒,并指定精度为 9: `SELECT TO_CHAR...
- `TIMESTAMP`类型: 存储精确到毫秒的时间戳。 - `SYSDATE`: 当前系统日期。 - `SYSTIMESTAMP`: 当前系统时间戳。 - `TO_DATE`和`TO_CHAR`: 日期格式转换。 - `LAST_DAY`: 返回当前月份的最后一天。 - `ADD_...
总的来说,处理毫秒时间戳与日期格式的转换是数据库操作中的常见需求。无论是MySQL还是Oracle,都有相应的解决方案。理解这些转换方法对于数据库开发者来说至关重要,能够帮助他们更好地管理和展示时间相关的数据,...
- `TIMESTAMP`:存储精确到毫秒的时间戳。 - **布尔数据类型**:仅有一种类型`BOOLEAN`,用于存储逻辑值`TRUE`、`FALSE`和`NULL`,但不支持直接存储到数据库表中。 - **LOB类型**:用于存储大型对象数据,如文本、...
在某些情况下,我们可能需要获取更精确的时间戳。 **1. 获取当前时间到毫秒级** ```sql SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM DUAL; ``` 此查询返回当前时间,精度到毫秒。 **...
然后向表中插入当前系统时间,提交更改,并查看各种时间戳类型在不同时区下的表现,通过对比数据库和会话时区,理解各种类型的特点。 总结来说,Oracle 中的 `TIMESTAMP` 类型提供了多种方式来处理日期和时间,...