澳门金沙vip 1

澳门金沙vipOracle计算时间差为毫秒的实现代码_oracle_脚本之家

SELECT ( ( (TO_TIMESTAMP('2016-04-13 17:13:50.998', 'YYYY-MM-DD HH24:MI:SS.FF9') + 0) - (TO_TIMESTAMP('2016-04-13 17:13:47.235', 'YYYY-MM-DD HH24:MI:SS.FF9') + 0) ) * 24 * 60 * 60 + TO_NUMBER ( '0' || ( TO_NUMBER(SUBSTR('2016-04-13 17:13:50.998', INSTR('2016-04-13 17:13:50.998', '.'))) - TO_NUMBER(SUBSTR('2016-04-13 17:13:47.235', INSTR('2016-04-13 17:13:50.235', '.'))) ) )) * 1000FROM DUAL

(1)获得系统时间
select sysdate from dual;

关键字: oracle 的to_char、to_number、to_date用法

TO_CHAR 是把日期或数字转换为字符串
TO_DATE 是把字符串转换为数据库中得日期类型转换函数
TO_NUMBER 将字符转化为数字

 TO_CHAR
使用TO_CHAR函数处理数字
TO_CHAR(number, ‘格式’)
TO_CHAR(salary,’$99,999.99’);
使用TO_CHAR函数处理日期
TO_CHAR(date,’格式’);

 TO_NUMBER
使用TO_NUMBER函数将字符转换为数字
TO_NUMBER(char[, ‘格式’])

 TO_DATE
使用TO_DATE函数将字符转换为日期
TO_DATE(char[, ‘格式’])

 数字格式格式
9 代表一个数字
0 强制显示0
$ 放置一个$符
L 放置一个浮动本地货币符
. 显示小数点
, 显示千位指示符

 日期格式
格式控制 描述
YYYY、YYY、YY 分别代表4位、3位、2位的数字年
YEAR 年的拼写
MM 数字月
MONTH 月的全拼
MON 月的缩写
DD 数字日
DAY 星期的全拼
DY 星期的缩写
AM 表示上午或者下午
HH24、HH12 12小时制或24小时制
MI 分钟
SS 秒钟
SP 数字的拼写
TH 数字的序数词

“特殊字符” 假如特殊字符
HH24:MI:SS AM 15:43:20 PM

日期例子:
SELECT TO_DATE(‘2006-05-01 19:25:34’, ‘YYYY-MM-DD HH24:MI:SS’) FROM
DUAL
SELECT TO_DATE(‘2006-05-01 19:25’, ‘YYYY-MM-DD HH24:MI’) FROM DUAL
SELECT TO_DATE(‘2006-05-01 19’, ‘YYYY-MM-DD HH24’) FROM DUAL
SELECT TO_DATE(‘2006-05-01’, ‘YYYY-MM-DD’) FROM DUAL
SELECT TO_DATE(‘2006-05’, ‘YYYY-MM’) FROM DUAL
SELECT TO_DATE(‘2006’, ‘YYYY’) FROM DUAL

日期说明:
当省略HH、MI和SS对应的输入参数时,Oracle使用0作为DEFAULT值。如果输入的日期数据忽略时间部分,Oracle会将时、分、秒部分都置为0,也就是说会取整到日。

同样,忽略了DD参数,Oracle会采用1作为日的默认值,也就是说会取整到月。

但是,不要被这种“惯性”所迷惑,如果忽略MM参数,Oracle并不会取整到年,取整到当前月。

注意:
1.在使用Oracle的to_date函数来做日期转换时,可能会直觉地采用“yyyy-MM-dd
HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810
格式代码出现两次”。如:select to_date(‘2005-01-01 13:14:20′,’yyyy-MM-dd
HH24:mm:ss’) from
dual;原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。select
to_date(‘2005-01-01 13:14:20′,’yyyy-MM-dd HH24:mi:ss’) from dual;
2.另要以24小时的形式显示出来要用HH24
select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’) from dual;//mi是分钟
select to_char(sysdate,’yyyy-MM-dd HH24:mm:ss’) from
dual;//mm会显示月份

 

Reference: 

这里是相差的毫秒数,如果需要显示小数的秒请删除 “ *
1000”这部分,下面是个测试代码,直接运行:

(7)当前日期往后退多少个月
select sysdate, add_months(sysdate,2) from dual;

SELECT ( ( (TO_TIMESTAMP(字段1, 'YYYY-MM-DD HH24:MI:SS.FF9') + 0) - (TO_TIMESTAMP(字段2, 'YYYY-MM-DD HH24:MI:SS.FF9') + 0) ) * 24 * 60 * 60 + TO_NUMBER ( '0' || ( TO_NUMBER(SUBSTR) - TO_NUMBER(SUBSTR) ) )) * 1000FROM 表名

(5)返回时区
select dbtimezone from dual;

这里我是用分隔字符串单独计算毫秒部分,如果有更好的办法,请大家分享一下,下面是查询时间差为毫秒的模板:

澳门金沙vip 1
两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒):
天:
ROUND(TO_NUMBER(END_DATE – START_DATE))
小时:
ROUND(TO_NUMBER(END_DATE – START_DATE) * 24)
分钟:
ROUND(TO_NUMBER(END_DATE – START_DATE) * 24 * 60)
秒:
ROUND(TO_NUMBER(END_DATE – START_DATE) * 24 * 60 * 60)
毫秒:
ROUND(TO_NUMBER(END_DATE – START_DATE) * 24 * 60 * 60 * 1000)

Oracle 中我们知道用 TO_DATE
函数可以进行秒、分、时、天、月、年、周等时间差的计算,但是毫秒却不好计算,TO_DATE
函数只能精确到秒,毫秒则只能用 TO_TIMESTAMP 函数,但是这个函数不像
TO_DATE 这样直接减出来的差值就是 NUMBER 类型,如果用 TO_NUMBER
函数转换也会报错。

(8)本月最后一天
select last_day(sysdate) from dual;