Я думаю, что вы должны попытаться сохранить формат как datetime
, когда вы делаете сравнение. В SQL Server 2008 появился новый тип данных time
, который был бы полезен, но в SQL Server 2005 мы должны использовать datetime
.
Я предполагаю, что вы используете convert(..., 114)
, чтобы получить только часть времени из переменной datetime
. Вы можете использовать этот код для удаления части даты и по-прежнему иметь переменную datetime
.
declare @dt datetime
set @dt = '2001-01-01T10:01:02.000'
select dateadd(d, datediff(d, @dt, 0), @dt)
Результат:
1900-01-01 10:01:02.000
Когда вы извлекаете данные из XML с помощью .value
, вы указываете тип данных, который будет использоваться. Если у вас есть только часть времени в XML, и вы укажете datetime
, вы получите время даты «1900-01-01». Таким образом, вы можете сделать сравнение, используя datetime
, как это.
declare @T table (ID int, XMLCol xml)
insert into @T
select 1, '<t1>10:01:01.123</t1><t2>10:01:02.123</t2>' union all
select 2, '<t1>11:01:01.123</t1><t2>11:01:02.123</t2>'
declare @dt datetime
set @dt = '2001-01-01T10:01:02.000'
select T.ID
from @T as T
where dateadd(d, datediff(d, @dt, 0), @dt) between
T.XMLCol.value('t1[1]', 'datetime') and
T.XMLCol.value('t2[1]', 'datetime')
Результат:
ID
1