2011-06-19 3 views
1

Я действительно не могу понять, почему инструкции SELECT CONVERT(NVARCHAR(30), GETDATE(), 114) выходы, например,Неправильный миллисекунды Сепаратор в SQL Server 2005

13:04:31:997 

вместо

13:04:31.997 

Почему миллисекунды сепаратор : Insted .? В случае, если вам нужно знать, мне нужно проверить, существует ли определенное время между двумя значениями времени, хранящимися как XML в таблице. Проблема заключается в том, что разделитель в этой таблице, как это обычно для меня, является ., так что использование сравнений между двумя форматами возвращает неверные результаты, потому что один использует ., а другой использует :. Есть ли способ получить время с помощью разделителя . без использования строковых функций, таких как REPLACE или без изменения формата, хранящегося в таблице?

ответ

1

Я думаю, вы должны попытаться сохранить формат как 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 
2

Это именно то, что говорит the documentation для стиля 114:

чч: ми: сс: ммм (24h)

Я не знаю ни одного способа изменения разделителя используется. Я бы предложил преобразовать XML-форматированное значение в datetime вместо преобразования текущей даты в текстовое значение. В конце концов, вы логически сравниваете даты и время, а не строки.

+0

Вы правы, но строка заказа дает точно такие же результаты, и именно поэтому я использую его. –

+0

@SQL: Но вместо этого конвертируя другой способ, вам не нужно беспокоиться о форматировании строки. Это, как правило, лучший подход - преобразование данных * в сторону * наиболее логичного формата данных, а не от него. –