这么给你说吧,首先结果肯定是一个date,因为你是date '2010-01-31'就指明了是日期 其次,再说+0.99999的意思吧:意思是在加"0.99999天" ,因为对于日期的加减运算是以天为单位的。 接下来就是说为什么查询结果:2010/1/31 23:59:59很简单,你执行下面两个SQL,看看结果是一样的, SELECT 0.99999*24*60*60 FROM DUAL; --86399.136 四舍五入就是86399秒,也就是23小时59分59秒 SELECT 23*60*60+59*60+59 FROM DUAL; --86399说白了,"0.99999天" 就是 86399 秒!
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> select date'2010-01-31'+0.99999 dt from dual; DT ------------------- 2010-01-31 23:59:59SQL> select date'2011-01-01'+10 dt from dual; --一个date类型的值与一个number值相加,是以天为单位了,不足一天的将会转换为时分秒的格式 --这里设计到一个隐式转换问题 DT ------------------- 2011-01-11 00:00:00
--看那一下0.99999天转换为具体时间格式: SQL> select numtodsinterval(0.99999*24*60*60,'second') from dual;NUMTODSINTERVAL(0.99999*24*60*60,'SECOND') ------------------------------------------------------------------- +000000000 23:59:59.136000000
不一定要5位小数的吧?SELECT date '2010-01-31'+0.999 FROM dual;DATE'2010-01-31'+0.999 2010-1-31 23:58:34
做了个测试,大家可以参考下第#3 和 #4 及 #11 和#12 的结果。但不确定oracle是否就是这么做的 --#1 SELECT 24*60*60 FROM dual; -- 查询结果:86400 (秒) SELECT date '2010-01-31'+0.00001 FROM dual; --2010-1-31 AM 12:00:01 SELECT 24*60*60*0.00001 FROM dual; --0.864 四舍五入后为 1 (秒),所以上面时间为2010-1-31 AM 12:00:01--#2 SELECT date '2010-01-31'+0.00002 FROM dual; --2010-1-31 AM 12:00:02 SELECT 24*60*60*0.00002 FROM dual; --1.728 四舍五入后为 2 (秒),所以上面时间为2010-1-31 AM 12:00:02--#3 SELECT date '2010-01-31'+0.00003 FROM dual; --2010-1-31 AM 12:00:03 SELECT 24*60*60*0.00003 FROM dual; --2.592 四舍五入后为 3 (秒),所以上面时间为2010-1-31 AM 12:00:03--#4 SELECT date '2010-01-31'+0.00004 FROM dual; --2010-1-31 AM 12:00:03 SELECT 24*60*60*0.00004 FROM dual; --3.456 四舍五入后为 3 (秒),所以上面时间为2010-1-31 AM 12:00:03--#5 SELECT date '2010-01-31'+0.00005 FROM dual; --2010-1-31 AM 12:00:04 SELECT 24*60*60*0.00005 FROM dual;-- 4.32 四舍五入后为 4 (秒),所以上面时间为2010-1-31 AM 12:00:04--#6 SELECT date '2010-01-31'+0.00006 FROM dual;--2010-1-31 AM 12:00:05 SELECT 24*60*60*0.00006 FROM dual; --5.184 四舍五入后为 5(秒),所以上面时间为2010-1-31 AM 12:00:05--#7 SELECT date '2010-01-31'+0.00007 FROM dual; --2010-1-31 AM 12:00:06 SELECT 24*60*60*0.00007 FROM dual; --6.048 四舍五入后为 6(秒),所以上面时间为2010-1-31 AM 12:00:06--#8 SELECT date '2010-01-31'+0.00008 FROM dual; SELECT 24*60*60*0.00008 FROM dual;--#9 SELECT date '2010-01-31'+0.00009 FROM dual; SELECT 24*60*60*0.00009 FROM dual;--#10 SELECT date '2010-01-31'+0.00010 FROM dual; SELECT 24*60*60*0.00010 FROM dual;--#11 SELECT date '2010-01-31'+0.00011 FROM dual;--2010-1-31 AM 12:00:10 SELECT 24*60*60*0.00011 FROM dual; --9.504 四舍五入后为 10(秒),所以上面时间为2010-1-31 AM 12:00:10--#12 SELECT date '2010-01-31'+0.00012 FROM dual; --2010-1-31 AM 12:00:10 SELECT 24*60*60*0.00012 FROM dual; --10.368 四舍五入后为 10(秒),所以上面时间为2010-1-31 AM 12:00:10
DATE'2010-01-31'+0.00001
------------------------
2010-1-31 0:00:01
SQL>
这么给你说吧,首先结果肯定是一个date,因为你是date '2010-01-31'就指明了是日期
其次,再说+0.99999的意思吧:意思是在加"0.99999天" ,因为对于日期的加减运算是以天为单位的。
接下来就是说为什么查询结果:2010/1/31 23:59:59很简单,你执行下面两个SQL,看看结果是一样的,
SELECT 0.99999*24*60*60 FROM DUAL; --86399.136 四舍五入就是86399秒,也就是23小时59分59秒
SELECT 23*60*60+59*60+59 FROM DUAL; --86399说白了,"0.99999天" 就是 86399 秒!
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.SQL> select date'2010-01-31'+0.99999 dt from dual;
DT
-------------------
2010-01-31 23:59:59SQL> select date'2011-01-01'+10 dt from dual;
--一个date类型的值与一个number值相加,是以天为单位了,不足一天的将会转换为时分秒的格式
--这里设计到一个隐式转换问题
DT
-------------------
2011-01-11 00:00:00
--看那一下0.99999天转换为具体时间格式:
SQL> select numtodsinterval(0.99999*24*60*60,'second') from dual;NUMTODSINTERVAL(0.99999*24*60*60,'SECOND')
-------------------------------------------------------------------
+000000000 23:59:59.136000000
2010-1-31 23:58:34
做了个测试,大家可以参考下第#3 和 #4 及 #11 和#12 的结果。但不确定oracle是否就是这么做的
--#1
SELECT 24*60*60 FROM dual; -- 查询结果:86400 (秒)
SELECT date '2010-01-31'+0.00001 FROM dual; --2010-1-31 AM 12:00:01
SELECT 24*60*60*0.00001 FROM dual; --0.864 四舍五入后为 1 (秒),所以上面时间为2010-1-31 AM 12:00:01--#2
SELECT date '2010-01-31'+0.00002 FROM dual; --2010-1-31 AM 12:00:02
SELECT 24*60*60*0.00002 FROM dual; --1.728 四舍五入后为 2 (秒),所以上面时间为2010-1-31 AM 12:00:02--#3
SELECT date '2010-01-31'+0.00003 FROM dual; --2010-1-31 AM 12:00:03
SELECT 24*60*60*0.00003 FROM dual; --2.592 四舍五入后为 3 (秒),所以上面时间为2010-1-31 AM 12:00:03--#4
SELECT date '2010-01-31'+0.00004 FROM dual; --2010-1-31 AM 12:00:03
SELECT 24*60*60*0.00004 FROM dual; --3.456 四舍五入后为 3 (秒),所以上面时间为2010-1-31 AM 12:00:03--#5
SELECT date '2010-01-31'+0.00005 FROM dual; --2010-1-31 AM 12:00:04
SELECT 24*60*60*0.00005 FROM dual;-- 4.32 四舍五入后为 4 (秒),所以上面时间为2010-1-31 AM 12:00:04--#6
SELECT date '2010-01-31'+0.00006 FROM dual;--2010-1-31 AM 12:00:05
SELECT 24*60*60*0.00006 FROM dual; --5.184 四舍五入后为 5(秒),所以上面时间为2010-1-31 AM 12:00:05--#7
SELECT date '2010-01-31'+0.00007 FROM dual; --2010-1-31 AM 12:00:06
SELECT 24*60*60*0.00007 FROM dual; --6.048 四舍五入后为 6(秒),所以上面时间为2010-1-31 AM 12:00:06--#8
SELECT date '2010-01-31'+0.00008 FROM dual;
SELECT 24*60*60*0.00008 FROM dual;--#9
SELECT date '2010-01-31'+0.00009 FROM dual;
SELECT 24*60*60*0.00009 FROM dual;--#10
SELECT date '2010-01-31'+0.00010 FROM dual;
SELECT 24*60*60*0.00010 FROM dual;--#11
SELECT date '2010-01-31'+0.00011 FROM dual;--2010-1-31 AM 12:00:10
SELECT 24*60*60*0.00011 FROM dual; --9.504 四舍五入后为 10(秒),所以上面时间为2010-1-31 AM 12:00:10--#12
SELECT date '2010-01-31'+0.00012 FROM dual; --2010-1-31 AM 12:00:10
SELECT 24*60*60*0.00012 FROM dual; --10.368 四舍五入后为 10(秒),所以上面时间为2010-1-31 AM 12:00:10