繁体   English   中英

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

[英]Date Range Query not returning all records - SQL

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

谁能帮助我找到解决方案?

更好的方法是这样的:

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数据类型,那么您将遇到严重的问题。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM