代码之家  ›  专栏  ›  技术社区  ›  Benny74

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

  •  0
  • Benny74  · 技术社区  · 11 年前

    我有一个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 回复  |  直到 11 年前
        1
  •  0
  •   krisku    11 年前

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

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

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

        2
  •  0
  •   Dan Bracuk    11 年前

    更好的方法是这样的:

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

    第一个原因是,如果适用的话,它将考虑时间因素。 第二个原因是在where子句中使用函数会减慢生产速度。

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