使用带变量和无变量的查询

时间:2015-04-22 12:56:14

标签: sql sql-server sql-server-2008

我有一个查询,用于过滤特定日期时间范围内的记录。出于测试目的,我使用变量创建一个查询,但它没有返回预期的结果。

以下是查询:

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年4月22日21:00:00

  

3 个答案:

答案 0 :(得分:3)

for (int i=0;i<b.length;i++) {
   if (b[i] != a[a.length-1-i]) {
      return false;
   }
}
return true;

给你答案:

  

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

第一个直接格式化是假设varchar转换并因此在第二个转换假定为datetime时进行style属性。

要获得没有变量工作的示例,可以使用

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

确保转换是从datetime转换。

答案 1 :(得分: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-

这是小提琴:http://sqlfiddle.com/#!6/9eecb/4727

答案 2 :(得分: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-