我的存储过程传递了mm / dd / yyyy日期作为输入。但是我需要输入日期以四舍五入到23:59:59
这是我当前的变量
DECLARE @AsOfDate VARCHAR(12)
SET @AsOfDate = '5/13/2019'
我尝试设置变量
DECLARE @Time TIME = '23:59:59.999'
我传递的变量错过了当天发生的分钟之后的记录。
答案 0 :(得分:0)
我传递的变量未命中当天发生的记录 分钟后。
在处理日期和日期时间数据类型时,这是一个常见问题。您的过程将日期输入为VARCHAR(12),然后查询将这些值转换为数据类型DATETIME
。考虑以下查询:
DECLARE @startDate VARCHAR(12) = '5/1/2019', @endDate VARCHAR(12) = '5/3/2019';
SELECT [@startDate] = CAST(@startDate AS DATETIME), [@endDate] = CAST(@endDate AS DATETIME);
返回:
@startDate @endDate
----------------------- -----------------------
2019-05-01 00:00:00.000 2019-05-03 00:00:00.000
在这种情况下,返回@startDate和@endDate之间的记录的查询将不会从2019/5/3返回任何信息(除非它恰好发生在2019-05-03 00:00:00.000)。现在看下面的查询。一共有5条记录,分别是5 / 1、5 / 2和5/3:
DECLARE @sales TABLE (saleDate DATETIME);
INSERT @sales(saleDate) VALUES ('2019-05-01 13:50:59.222'),('2019-05-02 03:50:22.255'),('2019-05-03 10:31:12.228');
DECLARE @startDate VARCHAR(12) = '5/1/2019', @endDate VARCHAR(12) = '5/3/2019';
SELECT *
FROM @sales AS s
WHERE s.saleDate BETWEEN @startDate AND @endDate;
...它不包括5/3的记录
saleDate
-----------------------
2019-05-01 13:50:59.223
2019-05-02 03:50:22.257
我需要输入日期以四舍五入到23:59:59
您可以这样做:
DECLARE @AsOfDate VARCHAR(12) = '5/3/2019' ;
SELECT DATEADD(MS,-2,DATEADD(DAY,1,CAST(@AsOfDate AS DATETIME)));
哪个返回2019-05-03 23:59:59.997
;您可以像这样在查询中使用它:
SELECT s.*
FROM @sales AS s
WHERE s.saleDate BETWEEN @startDate AND DATEADD(MS,-2,DATEADD(DAY,1,CAST(@endDate AS DATETIME)));
但这不是您真正想要的东西。这将为您提供所需的东西,而且更干净:
SELECT *
FROM @sales AS s
WHERE s.saleDate BETWEEN @startDate AND DATEADD(DAY,1,@endDate);
在这里,我只是向@endDate添加一天,这将解决您的问题。