Oracle SQL日期比较返回错误结果
我在数据库(Oracle SQL日期比较返回错误结果,sql,oracle,date,select,where-clause,Sql,Oracle,Date,Select,Where Clause,我在数据库(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(RE
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')
它返回结果,但我可以注意到错误的结果,例如:30.10.2013
,这是错误的结果
如何解决这个问题
何处显示字符(报告日期,'DD.MM.YYYY')>'09.11.2013'
您正在比较两个字符串。您需要比较日期。正如我在这里的另一个答案中所说的,您需要保留日期,因为它是用于日期计算的TO_CHAR用于显示,TO_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是一个日期列,因此它将具有datetime元素。因此,如果要在比较时排除时间元素,则需要使用TRUNC
WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')
但是,在日期列上应用TRUNC将抑制该列上的任何常规索引。从性能角度来看,最好使用日期范围条件
比如说,
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)
之间添加了一些修改,以优化具有相同结果的查询。到\u char(REPORTDATE,'DD.MM.YYYY')>'09.11.2013'。当您将其转换为字符时,您希望它如何进行比较?@Dejan,您不需要像我在最后显示的那样将TRUNC放在列上。@Lalit Kumar B-关于您回答的这一部分:“您正在比较两个字符串。您需要比较日期”:我认为值得指出的是,OP的原始查询不起作用的原因不是因为使用了字符串比较而不是日期比较。这是因为他们进行字符串比较的方式。如果他们曾经使用过_char(REPORTDATE,'YYYY.MM.DD')>'2013.09.11',那么查询就可以工作了。@dcp,这就像说'a'>'b'
@Latif Kumar b-我不确定我是否理解你的评论a'实际上比b'小。我的观点是,查询没有错,因为他比较的是字符串而不是日期,而他比较字符串的方式不正确。但是,您的答案似乎表明必须使用日期比较才能使查询正常工作,这是不正确的。@Davidaber我现在添加了该部分。COUNT(1)
不提供任何超过COUNT(*)
.COUNT(*)的内容。请检查是否有任何列的值不为null。计数(1)不检查单个列。它返回行数,而不是至少有一个字段不为null的行数。COUNT(*)检查是否有任何列的值不为null
-此语句的基础是什么?请看这里:@davidorenzomarino Count(*)和Count(1)在所有方面都是相同的。除非您是在原语版本上,而在原语版本中,它曾经有一些不同。过去曾就此进行过多次讨论。谷歌一下就知道了。这里是托马斯·凯特大师的最佳答案