将固定时间添加到日期时间会产生意外结果

时间:2018-05-25 01:05:56

标签: sql-server tsql date

我有一个带有两个日期时间变量(开始日期和结束日期)的查询,并附加两个不同的固定时间以允许业务交易时间偏移。

使用此逻辑的测试查询示例如下:

DECLARE @startdate datetime;
DECLARE @enddate datetime;

SET @startdate = convert(datetime,'2017-01-01')
SET @enddate = convert(datetime,'2017-01-02')


SELECT  *
FROM ig_Business..Check_Item_Detail CID (NOLOCK)
JOIN ig_business..Check_Sales_Detail CSD (NOLOCK) ON CSD.transaction_data_id = CID.transaction_data_id
WHERE csd.tendered_date_time BETWEEN DATEADD(m, DATEDIFF(m, 0, convert(date, @STARTDATE)), 0) + '06:00:00' 
AND DATEADD(m, DATEDIFF(m, 0, convert(date, @ENDDATE)), 0) + '05:59:59' 

但是,此查询的结果集为空,我不确定原因,因为当我运行

select DATEADD(m, DATEDIFF(m, 0, convert(date, @STARTDATE)), 0) + '06:00:00' 

我找回了一个看似有效的日期时间:2017-01-01 06:00:00.000

删除时间限制时返回的内容示例: enter image description here

2 个答案:

答案 0 :(得分:3)

  

我找回了一个看似有效的日期时间:2017-01-01 06:00:00.000

你不是。

您回复了自动转换为字符串的日期,并在末尾粘贴了另一个字符串,为您提供看起来像日期时间的字符串。

如果要在日期中添加内容,请使用另一个dateadd()。这将为您提供与实际日期时间的比较。

现在你正在"之间"使用日期时间和字符串。

我很惊讶它没有抛出错误。

答案 1 :(得分:2)

如果是2012年以上,您可以使用format()将时间附加到日期/日期时间值

示例

Declare @startdate date = '2017-01-01'
Select format(@startdate,'yyyy-MM-dd 06:00:00')

<强>返回

2017-01-01 06:00:00

format()可以包含在您的

...
Where SomeDateTime between format(@startdate,'yyyy-MM-dd 06:00:00') 
                       and format(@enddate,'yyyy-MM-dd 17:00:00')