2015-04-22 66 views
3

我有一个查询过滤记录在特定的日期时间范围。为了测试目的,我创建了一个包含变量的查询,并且不返回预期的结果。不同的结果,当使用查询变量和无变量

下面是该查询:

Declare @vTimeFrom datetime = '2015-04-22 20:00:00.000' 
Declare @vTimeTo datetime = '2015-04-23 08:00:00.000' 
Declare @pTime datetime = '2015-04-22 21:00:00.000' 

Select @pTime 
where Convert(Varchar(5),@pTime,108) 
BETWEEN Convert(Varchar(5),@vTimeFrom,108) and Convert(Varchar(5),@vTimeTo,108) 

它输出:

发现没有记录

上述查询返回任何内容。

但考虑这个查询:

Declare @vTimeFrom datetime = '2015-04-22 20:00:00.000' 
Declare @vTimeTo datetime = '2015-04-23 08:00:00.000' 
Declare @pTime datetime = '2015-04-22 21:00:00.000' 


Select @pTime 
where Convert(Varchar(5),'2015-04-22 21:00:00.000',108) 
between Convert(Varchar(5),'2015-04-22 20:00:00.000',108) 
and Convert(Varchar(5),'2015-04-23 08:00:00.000',108) 

它输出:

月,2015年22

21:00:00
+0

你不转换日期时间为varchar ... – jarlh

+0

我只是为什么在ResultSet中两个查询冲突 –

+2

查询1:转换(VARCHAR(5),日期时间,108),查询2:转换(VARCHAR( 5),varchar,108)... – jarlh

回答

2

Convert(Varchar(5),'2015-04-22 21:00:00.000',108)实际上只是left('2015-04-22 21:00:00.000', 5)。所以在第一种情况下你要检查时间,而在第二种情况下你要检查字符串。

Declare @vTimeFrom datetime = '2015-04-22 20:00:00.000' 
Declare @vTimeTo datetime = '2015-04-23 08:00:00.000' 
Declare @pTime datetime = '2015-04-22 21:00:00.000' 

select 
    convert(Varchar(5),@pTime,108), 
    Convert(Varchar(5),@vTimeFrom,108), 
    Convert(Varchar(5),@vTimeTo,108), 
    Convert(Varchar(5),'2015-04-22 21:00:00.000',108), 
    Convert(Varchar(5),'2015-04-22 20:00:00.000',108), 
    Convert(Varchar(5),'2015-04-23 08:00:00.000',108) 

------------------------------------------------------ 
21:00 20:00 08:00 2015- 2015- 2015- 
3
Select Convert(Varchar(5),'2015-04-22 21:00:00.000',108), Convert(Varchar(5),@pTime,108) , @pTime 

给你回答:

2015- | 21:00 | 2015-04-22 21:00:00

第一个直接格式是假定varchar转换,因此ingnoring style属性,而第二个转换是假定datetime。

为了得到例如不变量,则可以使用

Convert(Varchar(5), (cast ('2015-04-22 21:00:00.000' as datetime)),108) 

,以确保转换从日期时间转换。

2

这些格式适用于日期类型,它们不适用于字符串。所以他们返回不同的子串。

Declare @vTimeFrom datetime = '2015-04-22 20:00:00.000' 
Select Convert(Varchar(5),@vTimeFrom,108), 
Convert(Varchar(5),'2015-04-22 20:00:00.000', 108) 

输出:

20:00 2015- 

这里是提琴:​​