【问题标题】:Date Range Query not returning all records - SQL日期范围查询不返回所有记录 - SQL
【发布时间】:2013-08-28 13:11:54
【问题描述】:

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

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

【问题讨论】:

    标签: sql date between


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是一个糟糕的举动 - 试图将字段转换为日期数据类型。谢谢!
    【解决方案2】:

    更好的方法是这样的:

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

    【讨论】:

    • 同样的问题 - 它省略了一些结果。是的,我需要将该字段转换为日期数据类型。这是我最初的数据库设置中的一个疏忽。感谢您的快速回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多