如何将输入日期变量设置为一天中的分钟?

时间:2019-05-13 20:04:27

标签: sql tsql

我的存储过程传递了mm / dd / yyyy日期作为输入。但是我需要输入日期以四舍五入到23:59:59

这是我当前的变量

DECLARE @AsOfDate VARCHAR(12)    
SET @AsOfDate = '5/13/2019' 

我尝试设置变量

DECLARE @Time TIME = '23:59:59.999'

我传递的变量错过了当天发生的分钟之后的记录。

1 个答案:

答案 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添加一天,这将解决您的问题。