考虑以下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'
我正在尝试将日期转换为所需的格式,但我错过了表达式错误。我在这里做错了什么?
答案 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');