传递datetime而不是getdate()时结果不正确

时间:2015-12-29 23:00:54

标签: sql datetime

我正在处理SQL查询,该查询返回表中两个日期之间的所有记录,如下所示

select convert(varchar(2),TestDate,108) from dbo.Table 
where TestDate between convert(datetime,convert(varchar,GETDATE(),101))
                   and dateadd(day,1,convert(datetime,convert(varchar,GETDATE(),101))) 

上面的查询工作正常并给我想要的结果但是当我尝试使用普通日期字符串而不是getdate()时,查询返回并清空结果如下

select convert(varchar(2),TestDate,108) from dbo.Table 
    where TestDate between convert(datetime,convert(varchar,'2015-12-27 00:00:00.000',101)) and dateadd(day,1,convert(datetime,convert(varchar,2015-12-27 00:00:00.000',101))) 

上面的查询返回一个空的结果集,这不是我想要的。 我试过以不同的格式传递日期字符串但是没有用。

我知道一个正确的方法吗?

3 个答案:

答案 0 :(得分:1)

我猜你有额外的CONVERT。   无论你在哪里

convert(varchar,GETDATE(),101)

只需替换您的日期:

'2015-12-27 00:00:00.000'

因为CONVERT函数的目的是将Date转换为Varchar

答案 1 :(得分:1)

为什么要将日期转换为字符串进行比较?只需将比较作为日期。

此外,您可以使用datepart()来提取小时,而不是使用某种深奥的格式来convert()

select datepart(hour, TestDate)
from dbo.Table 
where TestDate between cast(GETDATE() as date) and
                       cast(dateadd(day, 1, getdate()) as date)

如果您希望将小时作为字符串而不是数字,请使用datename()而不是datepart()

答案 2 :(得分:1)

除了戈登的回答,您可以将字符串日期替换为:

select datepart(hour, TestDate)
from dbo.Table 
where TestDate between cast('2015-12-27 00:00:00.000' as date) and
                       cast(dateadd(day, 1, '2015-12-27 00:00:00.000') as date)

假设这是针对webapp的,请确保使用占位符而不是实际文本来防止SQL插入攻击。