这个sql where-clause有什么问题?

时间:2010-06-04 05:39:14

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

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

where CreatedDate between @StartDate and @EndDate

我只获取日期之间的记录,而不是StartDateEndDate上的记录...考虑我是否通过与StartDateEndDate相同的日期我应该能够选择该日期的所有记录。有什么建议吗?

5 个答案:

答案 0 :(得分:3)

在MSDN页面中关于BETWEEN

  

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

我会说@StartDate@EndDate可能不是您认为的那样 - DateTime数据类型包括小时,分钟,秒和毫秒,如果你想要一致的结果。

有关详细信息,请参阅this答案。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

的时间

答案 3 :(得分:0)

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

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

最好的修复可能是(A)使用显式>和&lt ;; (B)如果您只是不经常使用日期,则使用日期数学来获得正确的终点。 E.g:

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

答案 4 :(得分:0)

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

如果记录是从开始日期和结束日期开始,则在子句中将返回TRUE 这意味着它包括START和END日期。