使用oracle以秒为单位计算两个日期之间的时差

时间:2019-12-04 08:47:10

标签: sql oracle

我正在计算6到59秒之间的总记录总数,不起作用。

sum(
    case trunc((d.start_date-s.end_date)*24*60*60)
    when between 6 and 59 then 1
    end) as onemin
from employee; 

2 个答案:

答案 0 :(得分:1)

您需要将条件移动到when关键字之后:

sum( 
    case when trunc((d.start_date-s.end_date)*24*60*60) between 6 and 59 then 1 end
) as onemin

您可能还希望按以下方式表达条件,避免需要对每条记录应用一个函数(这可能更有效):

sum (
    case when
        d.start_date - s.end_date >= 6 / 24 / 60 / 60
        and d.start_date - s.end_date < 60 / 24 / 60 / 60 -- or 1 / 24 / 60
    then 1 end
) onemin

答案 1 :(得分:1)

CASE expression中有一个语法错误。

CASE expression
WHEN comparison_expression THEN return_expression
WHEN comparison_expression THEN return_expression
WHEN comparison_expression THEN return_expression
END

comparison_expression是单数项目时,它是有效的语法。如果要使用带有BETWEEN关键字的范围,则需要使用以下语法:

CASE
WHEN expression BETWEEN comparison_expression AND comparison_expression
  THEN return_expression
END

因此您可以使用:

CASE trunc((d.start_date-s.end_date)*24*60*60)
WHEN  6 THEN 1
WHEN  7 THEN 1
WHEN  8 THEN 1
-- ...
WHEN 59 THEN 1
END

或更简单地说,您可以将WHEN关键字移到TRUNC函数之前:

CASE
WHEN TRUNC( (d.start_date - s.end_date)*24*60*60 )
     BETWEEN 6 AND 59
THEN 1
END

由于end_date可能比start_date的值大,所以这仍然可能不会给您想要的答案,因此从后者减去前者的结果差为负数。一个简单的解决方法是交换条款:

CASE
WHEN TRUNC( (s.end_date - d.start_date)*24*60*60 )
     BETWEEN 6 AND 59
THEN 1
END

但是,这可能会更有效,因为它可以允许您使用索引(而将TRUNC中的差异换行将需要基于函数的索引):

CASE
WHEN (s.end_date - d.start_date)*24*60*60 >=  6
AND  (s.end_date - d.start_date)*24*60*60 <  60
THEN 1
END

db<>fiddle