Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle日期减法_Sql_Oracle_Plsql - Fatal编程技术网

Sql Oracle日期减法

Sql Oracle日期减法,sql,oracle,plsql,Sql,Oracle,Plsql,我该如何写出一个表达式,以天、小时、分钟、秒等表示两个日期之间的差异?默认情况下,在oracle中减去两个日期将以十进位形式返回天数。该十进制是所提供的两个日期之间的天数差。你可以做一些数学运算,把它转换成天、小时、分钟、秒等等 编辑:我知道你在找什么。我相信有一个更简单的方法,但我可能会这样做: select trunc(5.3574585) days, trunc(mod((5.3574585) * 24, 24)) hours, trunc(mod((5.3

我该如何写出一个表达式,以天、小时、分钟、秒等表示两个日期之间的差异?默认情况下,在oracle中减去两个日期将以十进位形式返回天数。

该十进制是所提供的两个日期之间的天数差。你可以做一些数学运算,把它转换成天、小时、分钟、秒等等

编辑:我知道你在找什么。我相信有一个更简单的方法,但我可能会这样做:

select trunc(5.3574585) days, 
       trunc(mod((5.3574585) * 24, 24)) hours, 
       trunc(mod((5.3574585) * 24 * 60, 60)) minutes, 
       trunc(mod((5.3574585) * 24 * 60 * 60, 60)) seconds 
  from dual;
…其中5.3574585是减法返回的天数

注意:这不是真正的测试,它在我的头顶上。

使用:

SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,
       TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,
       TRUNC(86400*(date2-date1)) - 60*(TRUNC((86400*(date2-date1))/60)) seconds,
       TRUNC((86400*(date2-date1))/60) - 60*(TRUNC(((86400*(date2-date1))/60)/60)) minutes,
       TRUNC(((86400*(date2-date1))/60)/60) - 24*(TRUNC((((86400*(date2-date1))/60)/60)/24)) hours,
       TRUNC((((86400*(date2-date1))/60)/60)/24) days,
       TRUNC(((((86400*(date2-date1))/60)/60)/24)/7) weeks
  FROM TABLE

参考资料:

您可以将日期转换为时间戳,并使用本机功能取出各个组件

SELECT EXTRACT( DAY    FROM ( end_timestamp - start_timestamp ) )   days
     , EXTRACT( HOUR   FROM ( end_timestamp - start_timestamp ) )   hours
     , EXTRACT( MINUTE FROM ( end_timestamp - start_timestamp ) )   minutes
     , EXTRACT( SECOND FROM ( end_timestamp - start_timestamp ) )   seconds
  FROM ( SELECT TO_TIMESTAMP( TO_CHAR( start_date, 'DD/MM/YYYY HH24:MI:SS' )
                            , 'DD/MM/YYYY HH24:MI:SS' )   start_timestamp
              , TO_TIMESTAMP( TO_CHAR( end_date, 'DD/MM/YYYY HH24:MI:SS' )
                            , 'DD/MM/YYYY HH24:MI:SS' )   end_timestamp
           FROM ( SELECT TO_DATE( '01/10/2009 14:25:01'
                                , 'DD/MM/YYYY HH24:MI:SS' )   start_date
                       , TO_DATE( '03/10/2009 23:09:15'
                                , 'DD/MM/YYYY HH24:MI:SS' )   end_date
                    FROM dual
                )
       )

为什么不直接转换为时间戳并隐式地使用从一天到第二天的间隔数据类型呢

select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff
from dual
/

DIFF        
----------- 
1 2:57:42.0 

我选择这个答案是因为它简短、体贴、易读。投票支持所有答案——它们都有效!谢谢大家。我们警告说,这些数字是浮点型的,因此如果您试图对结果运行FLOOR函数,您可能会遇到错误(10:30:40-10:14:40应该正好是16分钟,但天数是.011(重复1次)。