2015-03-12 5 views
0

У меня есть таблица с двумя столбцами даты и времени, и я пытаюсь преобразовать их в формат ISO строки, используя следующий запрос:Server 2008 несогласованные результаты SQL при преобразовании даты и времени в VARCHAR

select 
    CONVERT(VARCHAR(23), date1, 126) as date1, 
    CONVERT(VARCHAR(23), date2, 126) as date2 
from 
    some_table 

Но я получать два различных результата, один с миллисекундах и один без

date1      date2 
2015-03-11T05:16:04.663  2015-03-11T05:15:43 

Я смотрел на таблицу создания сценария и оба они определяются как DateTime. Я не знаю, как данные вставляются.

Как получить оба столбца для возврата с миллисекундами?

+0

Значение 'date2' всегда имеет значение 0 миллисекунд? Потому что я думаю, что он пропускает миллисекунды, если нет ненулевых цифр. –

ответ

1

SQL Server «услужливо» будет обрезать часть миллисекунды, если он полностью 0. Если вы потребность в 0 миллисекунды включены (я не могу себе представить, что вы делаете, когда вам нужно .000 быть включен), то вы» придется обнаружить обрезку и повторно добавить их:

;With Converted as (
    --Your existing query. For this example, I'm just using one date: 
    select CONVERT(varchar(23),CONVERT(datetime,'2015-03-01T05:15:43.000'),126) as date2 
) 
select 
    CASE 
     WHEN LEN(date2) = 19 THEN date2 + '.000' 
     ELSE date2 
    END as date2 
from Converted 

(и, опять же, если по какой-то странной причине вам действительно нужно конечный результат быть varchar(23), а не varchar(27) вам придется добавить еще CONVERT который обертывает выражение CASE, потому что система недостаточно умна, чтобы понять, что любое значение, которое CASE Возврат может всегда вписываться в varchar(23))

+0

Что, черт возьми, точка формата, если это не согласовано. Спасибо, человек, это не вы виноваты. Mssql невозможно. Я соглашусь через 5 минут. – haki

0

Это потому, что вторая дата имеет 0 мс.

CREATE TABLE #Test (date1 datetime, date2 datetime) 

INSERT INTO #Test VALUES ('2015-03-11 05:16:04.663','2015-03-11 05:15:43') 

INSERT INTO #Test VALUES ('2015-03-11 05:16:04','2015-03-11 05:15:43.55') 


select 
    CONVERT(VARCHAR(23), date1, 126) as date1, 
    CONVERT(VARCHAR(23), date2, 126) as date2 
from 
    #Test 

Проверьте этот пример.

Смежные вопросы