其实很早以前就经常碰到这个问题,就是得到自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 1038SELECT (SELECT listagg(b.sql_te ... -
CLOB列 XML信息查看
2014-05-28 10:28 982--使用该SQL查询节点情况 SELECT * FROM ... -
【转】ORACLE 临时表空间使用率过高的原因及解决方案
2012-12-25 15:24 928http://www.cnblogs.com/wonder31 ... -
oracle:获取session的IP地址
2012-10-20 02:38 4222方法1 创建触发器: create orreplace ... -
Oracle ora-01002
2012-08-11 02:43 28760ORA-01002:fetch超出序列 ... -
提高Oracle SQL的执行效率的3个方案
2012-08-08 00:57 951如果你想要提高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 1355自动工作负载库(Automatic Workload Repo ... -
orace的隔离级别
2012-07-21 01:06 1076隔离级别(isoation eve) 隔离级别定义了事务与 ... -
Oracle SQLID 与 Hash_value 之间的相互转化
2012-07-20 00:55 4669一、什么是SQLID SQLID是根据SQL 文本,经过 ... -
Oracle优化器和索引原
2012-07-13 00:34 1244Oracle优化器和索引原理 ============ ... -
Oracle优化器的RBO和CBO方式
2012-07-13 00:25 2375[/size]Or[size=large][size=smal ... -
Oracle 优化器详解
2012-07-13 00:18 1329一、优化器基本知识 Oracle在执行一个SQL之前,首先 ... -
SQL中使用WITH AS提高性能
2012-07-05 23:30 1149摘要:本文结合笔者实 ... -
Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题
2012-07-01 23:46 2076最近开始接触Oracle了,接触的越多越感受到自己的渺小!(o ... -
Oracle表连接操作——Hash Join(哈希连接
2012-05-20 17:05 0连接 http://space.itpub.net/?uid ... -
Oracle hash join
2012-05-20 17:00 874hash join是oracle里面一个 ... -
转--一次HASH JOIN 临时表空间不足的分析和优化思路
2012-05-20 15:36 4479最近遇到一个语句, 只要一执行这个语句就会出现报错临时表空间 ... -
SQL*PLUS SET 变量
2012-05-02 22:46 851SQL*PLUS SET变量 SQL*PLUS维护系 ...
相关推荐
oracle中日期类型与unix 时间戳的转换, Unix时间戳记是从'1970-01-01 00:00:00'GMT开始的秒数,表现为整数型。 Oracle中的时间是Date型,以下函数提供了两种时间转换的Oracle函数 --unix时间戳与date时间互转 ...
主要介绍了PHP实现获取毫秒时间戳的方法,结合实例形式分析了php使用microtime()函数获取、转换毫秒级时间戳的相关操作技巧,需要的朋友可以参考下
下面小编就为大家带来一篇php生成毫秒时间戳的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
开源的时间戳精确到毫秒级别几乎全API函数部分使用支持库命令,此源代码精易没有功能都是类似的.@tian89。
java 获取指定日期(带毫秒)的 13位时间戳 ,获取当前时间的时间戳 一句话就可以System.currentTimeMillis();
本文实例讲述了python正常时间和unix时间戳相互转换的方法。分享给大家供大家参考。具体分析如下: 这段代码可以用来转换常规时间格式为unix时间戳,也可以将unix时间戳转换回来, 例如:1332888820 格式转换成 ...
本文实例讲述了PHP获取毫秒级时间戳的方法。...为获取更为精准的毫秒级时间戳可以使用下面的代码: <?php function getMillisecond() { list($t1, $t2) = explode(' ', microtime()); return (float)sprin
vc6工程,显示windows当前毫秒值的计数器
主要给大家介绍了关于iOS将时间NSDate转化为毫秒时间戳的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
玛德,mysql没有获取当前毫秒方法,这个自定义函数返回的时间格式为 yyyy-mm-dd hh:mi:ss sss char(23) 通常用于时间戳,防止记录并发修改。 毫秒用的是随机数,目的是防止短时间内两个时间戳值相同
时间戳转换工具,将oracle中的时间戳转换为时间格式。
Unix时间戳和北京时间互相转换,html+js实现,浏览器打开即可查看效果,可以以文本方式打开查看源代码
oracle timestamp详解 将常用的转换方法及使用注意事项都罗列出来了
/** 获取当前时间戳,精确到毫秒 */ function microtime_float() { list($usec, $sec) = explode( , microtime()); return ((float)$usec + (float)$sec); } /** 格式化时间戳,精确到毫秒,x代表毫秒 */ function...
主要介绍了oracle数据库实现获取时间戳的无参函数的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
获取秒级时间戳与毫秒级时间戳、微秒级时间戳 import time import datetime t = time.time() print (t) #原始时间数据 print (int(t)) #秒级时间戳 print (int(round(t * 1000))) #毫秒级时间戳 print (int(round(t...
// 使用2018年的毫秒时间戳判断 return time.getTime() Date.now(); } }, pickerOptions1: { disabledDate: time => { // 使用2018年的毫秒时间戳判断 return time.getTime() Date.now(); } } } } ...
labview获取当前日期时间精确到毫秒字符串