0

我有一个 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')"

任何人都可以帮助指导我解决问题吗?

4

2 回答 2

0

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

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

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

于 2013-08-28T13:24:44.367 回答
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 数据类型,那么您会遇到严重的问题。

于 2013-08-28T13:21:00.187 回答