Oracle SQL 日期比较 returns 错误结果
Oracle SQL comparison of DATEs returns wrong result
我在数据库 (DATETIME
) 类型中有 REPORTDATE
列。
我只想从 DATETIME 中提取 DATE
值,然后每天执行 COUNT
并放置 WHERE
子句以仅限制晚于某个特定日期的日期。
所以我有这个条款:
SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(*) from INCIDENT
where to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')
它 returns 我的结果,但我可以注意到错误的结果,例如: 30.10.2013
这是错误的结果。
如何解决?
WHERE to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
您正在比较两个 STRINGS。您需要比较 DATEs。正如我在此处的其他答案中所说的那样,您需要保留日期以进行 DATE 计算。 TO_CHAR是为了显示,TO_DATE是把一个字符串字面量转成DATE。
SELECT TO_CHAR(REPORTDATE, 'DD.MM.YYYY'),
COUNT(*)
FROM TABLE
WHERE REPORTDATE > TO_DATE('09.11.2013', 'DD.MM.YYYY')
GROUP BY TO_CHAR(REPORTDATE, 'DD.MM.YYYY')
此外,REPORTDATE 是 DATE 列,因此它将具有日期时间元素。所以,如果你想在比较时排除时间元素,你需要使用TRUNC
WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')
但是,在日期 column 上应用 TRUNC 会抑制该 index 上的任何常规 index柱子。从性能的角度来看,最好使用 日期范围条件 .
例如,
WHERE REPORTDATE
BETWEEN
TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND
TO_DATE('09.11.2013', 'DD.MM.YYYY') +1
条件to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
比较字符串,所以30.10.2013
在09.11.2013
之后。
您需要比较日期,而不是字符串值,因此您必须将查询更改为以下内容。
SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(1)
from INCIDENT
where trunc(REPORTDATE)> to_date('09.11.2013', 'DD.MM.YYYY')
GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')
注意:我从count(*)
添加了一点修改到count(1)
以优化具有相同结果的查询。
我在数据库 (DATETIME
) 类型中有 REPORTDATE
列。
我只想从 DATETIME 中提取 DATE
值,然后每天执行 COUNT
并放置 WHERE
子句以仅限制晚于某个特定日期的日期。
所以我有这个条款:
SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(*) from INCIDENT
where to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')
它 returns 我的结果,但我可以注意到错误的结果,例如: 30.10.2013
这是错误的结果。
如何解决?
WHERE to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
您正在比较两个 STRINGS。您需要比较 DATEs。正如我在此处的其他答案中所说的那样,您需要保留日期以进行 DATE 计算。 TO_CHAR是为了显示,TO_DATE是把一个字符串字面量转成DATE。
SELECT TO_CHAR(REPORTDATE, 'DD.MM.YYYY'),
COUNT(*)
FROM TABLE
WHERE REPORTDATE > TO_DATE('09.11.2013', 'DD.MM.YYYY')
GROUP BY TO_CHAR(REPORTDATE, 'DD.MM.YYYY')
此外,REPORTDATE 是 DATE 列,因此它将具有日期时间元素。所以,如果你想在比较时排除时间元素,你需要使用TRUNC
WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')
但是,在日期 column 上应用 TRUNC 会抑制该 index 上的任何常规 index柱子。从性能的角度来看,最好使用 日期范围条件 .
例如,
WHERE REPORTDATE
BETWEEN
TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND
TO_DATE('09.11.2013', 'DD.MM.YYYY') +1
条件to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'
比较字符串,所以30.10.2013
在09.11.2013
之后。
您需要比较日期,而不是字符串值,因此您必须将查询更改为以下内容。
SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(1)
from INCIDENT
where trunc(REPORTDATE)> to_date('09.11.2013', 'DD.MM.YYYY')
GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')
注意:我从count(*)
添加了一点修改到count(1)
以优化具有相同结果的查询。