SQL命令未正确结束(oracle 11g for windows)

时间:2015-02-05 13:42:36

标签: sql oracle datetime oracle11g nvl

我使用此查询来获取活动的开始时间和结束时间之间差异的结果。如果结束时间为空,我想将最小值设为500.请建议并帮助!!

select * from table
   where (end_time - start_time) * 24 * 60 > 1, 
  IF end_time IS NULL THEN '500';

3 个答案:

答案 0 :(得分:0)

这是您的查询:

select * from table where (end_time - start_time) * 24 * 60 > 1;

但是你想将null end_time视为500.所以使用NVL或COALESCE将null替换为500:

select * from table where (nvl(end_time,500) - start_time) * 24 * 60 > 1;

答案 1 :(得分:0)

  

IF end_time IS NULL那么' 500';

只是为了说清楚,' 500'不是数字而是字符串,因为它包含在单引号中。

现在,end_time是。理想情况下, DATE 数据类型或时间戳。所以,500毫无意义。您必须将其转换为适当的类型,无论500是天,小时,分钟,秒,小数秒

与其他答案一样,建议使用NVL(end_time, 500),这没有任何意义。 500 - a date是什么意思?应用 NVL 是必要的,但是,您必须将其转换为所需的值,否则两种不同的数据类型 Oracle 赢得&#39 ;允许它。

更新

在我看来,

  

两个日期之间的差异给出了转换回天数的精度秒数。但是,任意数字和日期之间的差异是没有意义的。

答案 2 :(得分:0)

我假设start_time和end_time列的编号为数据类型,对于此计算,您需要选择这些特定列而不是全部(*)。比较在where子句中,这适用于oracle11。

select ((NVL(END_TIME, 500)-START_TIME) * 24 * 60) from TABLE_NAME where ((NVL(END_TIME, 500)-START_TIME) * 24 * 60) > 1;