Неверный миллисекундный разделитель в SQL Server 2005 - PullRequest
1 голос
/ 19 июня 2011

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

13:04:31:997

вместо

13:04:31.997

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

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Это именно то, что документация говорит для стиля 114:

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

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

1 голос
/ 19 июня 2011

Я думаю, что вы должны попытаться сохранить формат как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...