如何选择条件在同一日期之间的所有数据?

时间:2015-11-10 07:40:12

标签: sql-server sql-server-2012

我有参数@firstDate@lastDate的存储过程我还有一个名为Products的表格,其中包含字段idproductName,{ {1}}和status

我想从orderDate获取orderDate条件的数据。
我尝试过这种语法:

BETWEEN

这是我已插入表格中的示例数据

enter image description here

当我添加相同的日期时,例如' 2015-10-12'对于CREATE PROCEDURE sp_Order ( @firstDate DATETIME, @lastDate DATETIME ) AS BEGIN SELECT productName, orderDate FROM Products WHERE orderDate BETWEEN @firstDate AND @lastDate AND status = 'Active' GROUP BY productName, orderDate ORDER BY orderDate END @firtDate,它没有显示任何内容,而且当我添加' 2015-10-10'对于@lastDate和' 2015-10-12'对于@firstDate,它仅显示日期' 2015-10-10'的产品列表。

怎么会发生这种情况?什么是正确的语法?

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

当您使用datetime或datetime2数据类型查找给定日期的日期时,搜索条件应介于当天的第1纳秒和第二天的第1天之间。

这是最好的选择,以避免丢失准确性或日期向上或向下。

如果您不需要时间部分,最好使用DATE数据类型。您可以随时将其强制转换回日期时间。

如果我按照您的示例查找2015-10-12,您正在执行:

orderDate between '2015-10-12 00:00:00.000' AND '2015-10-12 00:00:00.000'
orderDate >= '2015-10-12 00:00:00.000' AND orderDate <= '2015-10-12 00:00:00.000'

什么时候应该使用:

set @firstDate ='2015-10-12 00:00:00.000'    设置@lastDate ='2015-10-13 00:00:00.000'

正如BETWEEN页面上的解释:

  

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

BETWEEN功能类似于:

orderDate BETWEEN @firstDate AND @lastDate
orderDate >= @firstDate AND orderDate <= @lastDate

您最终还会获得“2015-10-12 00:00:00.000”的价值。

它还解释了备注部分中的操作:

  

要指定独占范围,请使用大于(&gt;)和小于运算符(&lt;)。

因此你必须使用:

orderDate >= @firstDate AND orderDate < @lastDate

由于您需要@firstDate@lastDate之间的天数并包含这些值,因此最佳选择是

orderDate >= @firstDate AND orderDate < DATEADD(day, 1, @lastDate)

仍然@firstDate@lastDate等于2015-10-12,查询将搜索:

orderDate >= `2015-10-12` AND orderDate < DATEADD(day, 1, `2015-10-12`)
orderDate >= '2015-10-12 00:00:00.000' AND orderDate < '2015-10-13 00:00:00.000'

最后,您还会在这个问题的答案中找到很多好处:Why does my query search datetime not match?