【问题标题】:What is wrong with this sql where-clause?这个 sql where 子句有什么问题?
【发布时间】:2011-02-27 15:25:38
【问题描述】:

我正在根据同一列中的两个日期选择记录,但我的 where 条件无法选择 StartDateEndDate 上的记录...

where CreatedDate between @StartDate and @EndDate

我只得到日期之间的记录,而不是 StartDateEndDate 上的记录...考虑如果我传递的日期与 StartDateEndDate 相同,我应该能够选择所有该日期的记录。有什么建议吗?

【问题讨论】:

  • 你有附加时间组件吗?
  • @gbn 我附加了时间组件
  • 我假设这是一个日期/时间列。时间会不会让你失望(即 2010 年 6 月 3 日 0:00:00 和 2010 年 6 月 3 日 0:00:00 之间)。在这种情况下什么都不会回来。
  • 您的输入可能不是您认为的那样。

标签: sql sql-server-2005 select date where-clause


【解决方案1】:

我想你有时间附在日期上。如果是,请尝试转换或转换它。 或者您可能将日期存储在 Varchar 列中。

如果记录是 FROM 开始日期和结束日期,Between 子句将返回 TRUE 这意味着它包括开始和结束日期。

【讨论】:

    【解决方案2】:

    请记住,SQL Server DATETIME 包含时间组件,如果您不指定时间,则默认为午夜——午夜是当天的第一个瞬间。

    实际上,如果您说BETWEEN '6/3/2010' AND '6/4/2010',那么您将看到的唯一来自 6/4 的记录是发生在 2010 年 6 月 4 日 00:00:00 的记录。如果您在 6 月 4 日 12:34 有记录,则不予退还。

    最好的解决办法可能是 (A) 使用显式 > 和

    WHERE order_date >= @StartDate
    AND   order_date <  CAST(FLOOR(CAST(@StartDate AS FLOAT)) AS DATETIME) + 1
    

    【讨论】:

      【解决方案3】:

      BETWEEN 包含在内。您指定的日期是什么?请记住,DATETIME 精确到毫秒,因此如果您的日期相差一毫秒,那么您将不会选择“等于”部分。

      您应该能够手动调整 @StartDate 和 @EndDate 以执行您想要的操作:

      SET @StartDate = CAST(FLOOR(CAST(@StartDate AS FLOAT)) AS DATETIME)
      SET @EndDate = CAST(FLOOR(CAST(@StartDate AS FLOAT) + 1) AS DATETIME)
      
      ...
      WHERE
         CreatedDate BETWEEN @StartDate AND @EndDate
      

      【讨论】:

      • 为什么?这正是两者之间的作用
      【解决方案4】:

      来自关于BETWEEN的MSDN页面:

      如果 test_expression 的值大于或等于 begin_expression 的值且小于或等于 end_expression 的值,则 BETWEEN 返回 TRUE。

      我想说@StartDate@EndDate 可能不是您认为的那样-DateTime 数据类型包括小时、分钟、秒和毫秒,如果您想要一致的结果,也应该指定这些。

      更多详情请参阅this 答案。

      【讨论】:

        【解决方案5】:

        看到这个问题:Does MS SQL Server's "between" include the range boundaries?;我认为您的问题可能是 in this answer 解释的时间

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-18
          • 2011-08-28
          • 2014-05-08
          • 1970-01-01
          相关资源
          最近更新 更多