错误:缺少表达式oracle

时间:2015-03-24 06:43:17

标签: mysql sql oracle

考虑以下sql查询:

select count(*) from cycle WHERE (select to_char(STARTTIME_UTC, 'yyyy-mm-dd hh24:mi:ss')) between '2015-03-17 15:55:00' and '2015-03-16 12:15:05'

我正在尝试将日期转换为所需的格式,但我错过了表达式错误。我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您不应将日期转换为字符串。您应该将字符串转换为日期:

select count(*) from cycle WHERE STARTTIME_UTC between to_date('2015-03-17 15:55:00', 'yyyy-mm-dd hh24:mi:ss') and to_date('2015-03-16 12:15:05','yyyy-mm-dd hh24:mi:ss')

查询中的错误消息来自select。 Yu必须删除它。

答案 1 :(得分:0)

如果您要在SQL*Plus中执行查询,那么您将清楚地看到错误发生的位置:

SQL> SELECT COUNT(*)
  2  FROM dual
  3  WHERE (SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'))
  4  BETWEEN '2015-03-17 15:55:00' AND '2015-03-16 12:15:05';
WHERE (SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'))
                                                       *
ERROR at line 3:
ORA-00936: missing expression


SQL>

因此,SQL * Plus清楚地向您显示错误在WHERE (SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'))部分。

对于 DATE 列的任何计算,您需要保留日期。您可以使用 TO_CHAR 将日期转换为字符串 DISPLAY 。如果您有字符串,并进行任何日期计算,请使用 TO_DATE 将其转换为日期。

此外,

  

BETWEEN'2015-03-17 15:55:00'和'2015-03-16 12:15:05'

将强制Oracle进行内部数据类型转换

您必须始终使用 TO_DATE 将字符串明确转换为日期以进行日期计算。因此,要避免内部转换,请使用以下查询:

 SELECT Count(*)
FROM   cycle 
WHERE  (SELECT To_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')) BETWEEN
              To_date('2015-03-17 15:55:00', 'yyyy-mm-dd hh24:mi:ss') AND
              To_date(
              '2015-03-16 12:15:05', 'yyyy-mm-dd hh24:mi:ss');