我有参数@firstDate
和@lastDate
的存储过程我还有一个名为Products
的表格,其中包含字段id
,productName
,{ {1}}和status
。
我想从orderDate
获取orderDate
条件的数据。
我尝试过这种语法:
BETWEEN
这是我已插入表格中的示例数据
当我添加相同的日期时,例如' 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'的产品列表。
怎么会发生这种情况?什么是正确的语法?
感谢您的回答。
答案 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?