我有一个查询,用于过滤特定日期时间范围内的记录。出于测试目的,我使用变量创建一个查询,但它没有返回预期的结果。
以下是查询:
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
答案 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-
答案 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-