日期范围查询不返回所有记录 - SQL

时间:2013-08-28 13:11:54

标签: sql date between

我有一个SQL数据库,我需要根据库存项目完成的月份来过滤结果,以便进行结算。

我正在使用的字段称为CompletionDate。这是我正在使用的代码。

input name='criteria' type='hidden' value="WHERE CompletionDate BETWEEN '8-1-2013' AND '8-31-2013'"

我得到了一些记录,但不是全部。我怀疑问题在于CompletionDate字段的格式。它目前是一个varchar(10)。我将数据存储在此字段中,格式为MM-DD-YYYY。

经过一些搜索后我明白了,因为该字段是一个varchar数据类型,上面提到的代码不能按照我想要的方式工作。我试过这个无济于事。

input name='criteria' type='hidden' value="WHERE to_date(CompletionDate, 'mm-dd-yyyy') BETWEEN to_date('8-1-2013', 'mm-dd-yyyy') AND to_date('8-31-2013', 'mm-dd-yyyy')"

有人可以帮我指导解决方案吗?

2 个答案:

答案 0 :(得分:0)

更好的方法是这样的:

where CompletionDate >= the start of your date range
and CompletionDate < the day after the end of your date range.

原因1是如果适用的话,它会考虑时间因素。 原因2是使用where子句中的函数会减慢生产。

顺便说一句,如果您的数据库中的CompletionDate是char或varchar数据类型,则会出现严重问题。

答案 1 :(得分:0)

因为该字段是varchar类型,所以您不是在搜索日期范围,而是搜索文本范围。您确实应该将日期存储在日期类型字段中,因为这样您就可以轻松高效地进行日期范围查询。

使用to_date的解决方法在理论上应该可行,尽管由于数据库必须尝试将每行的文本转换为实际日期以便能够进行比较,因此效率相当低。至于为什么它实际上不起作用仍然不清楚。你用的是什么数据库?格式字符串是正确的还是大写('MM-DD-YYYY')?

如果您顽固地将日期作为文本存储在数据库中,则使用可以按字母顺序排序的格式,例如: YYYY-MM-DD包括前导零(2013-08-01),似乎可以使范围查询起作用。但是,数据库有专门的日期数据类型确实有几个很好的理由!