我根据同一列中的两个日期选择记录,但我的where条件无法选择StartDate
和EndDate
上的记录......
where CreatedDate between @StartDate and @EndDate
我只获取日期之间的记录,而不是StartDate
和EndDate
上的记录...考虑我是否通过与StartDate
和EndDate
相同的日期我应该能够选择该日期的所有记录。有什么建议吗?
答案 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日期。