SELECT date '2010-01-31'+0.99999 FROM dual; --查询结果:2010/1/31 23:59:59

解决方案 »

  1.   

    SQL> SELECT date '2010-01-31'+0.00001 FROM dual;
     
    DATE'2010-01-31'+0.00001
    ------------------------
    2010-1-31 0:00:01
     
    SQL> 
      

  2.   


    这么给你说吧,首先结果肯定是一个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 秒!
      

  3.   


    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
      

  4.   


    --看那一下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.   

    不一定要5位小数的吧?SELECT date '2010-01-31'+0.999 FROM dual;DATE'2010-01-31'+0.999
    2010-1-31 23:58:34
      

  6.   


    做了个测试,大家可以参考下第#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