我正在计算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;
答案 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