В SQL-преобразовании даты и времени с вложенными преобразованиями возникают случайные ошибки преобразования

Нужна помощь в решении странной проблемы, если у кого-то есть идеи:

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

Цель этого кода состоит в том, чтобы добавить время к уже существующему значению даты и времени, которое имеет 00:00:00 как время из второго столбца времени (как показано ниже). Моя цель - объединить оба столбца в формате ГГГГ-ММ-ДД ЧЧ: ММ: СС, но мне пришлось сначала преобразовать их в тип char, чтобы обрезать оригинал 00:00:00.

Колонны

LogDate - содержит дату только в формате DateTime (ГГГГ-ММ-ДД ЧЧ: ММ: СС)

LogTime - содержит время действия и в формате varchar (ЧЧ: ММ)

Преобразование SQL

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108))
                FROM  TestTable
                WHERE EventSerial = '100001'

Однако если я изменю EventSerial в приведенном выше операторе на другую строку, такую ​​как "100002", оператор сработает.

Данные для каждой строки ниже:

Значения EventSerial 100001: LogDate : 2015-04-02 00: 00: 00.000 LogTime: 10:04

Значения EventSerial 100002: LogDate : 2015-04-02 00: 00: 00.000 LogTime: 10:48

Работа с набором данных 1 завершается неудачно, работа с набором данных 2 приводит к выводу. Кроме того, работает код без окончательного преобразования даты и времени, или если я запускаю код со строкой вручную, он работает (как описано ниже:)

SELECT CONVERT(CHAR(8), LogDate, 112) + ' ' + CONVERT(CHAR(8), LogTime, 108)
                FROM  TestTable
                WHERE EventSerial = '100001'


SELECT  CONVERT(DATETIME, '20150402 10:48')
SELECT  CONVERT(DATETIME, '20150402 10:04') 

Любые предложения, я уверен, что это что-то глупое, что я упускаю (и я, вероятно, все равно обошел проблему. Желаемый результат будет 2015-04-02 10:04:00

2 ответа

Решение

Во-первых, дата и время не имеют формата. ( почему?)

Во-вторых, вам не нужно конвертировать datetime значение для char чтобы добавить часы и минуты, просто используйте DateAdd:

SELECT DATEADD(Minute, 
               CAST(RIGHT(LogTime, 2) as int), 
               DATEADD(Hour, 
                       CAST(LEFT(LogTime, 2) as int), 
                       LogDate
                   )
              )
FROM  TestTable
WHERE EventSerial = '100001'

Также обратите внимание, что convert не имеет стиля для yyyymmdd hh:mm

Примечание: код был написан прямо здесь, могут быть некоторые ошибки.

Я не уверен, почему вы получаете ошибку... возможно, есть какие-то невидимые символы в вашем поле времени varchar... как вкладка или что-то еще? Попробуйте этот запрос:

SELECT ascii(substring(LogTime,1,1)) Char1, 
    ascii(substring(LogTime,2,1)) Char2,  
    ascii(substring(LogTime,3,1)) Char3,  
    ascii(substring(LogTime,4,1)) Char4,  
    ascii(substring(LogTime,5,1)) Char5
FROM  TestTable
WHERE EventSerial = '100001'

Это должно показать эти результаты:

Char1       Char2       Char3       Char4       Char5
----------- ----------- ----------- ----------- -----------
49          48          58          48          52

(1 row(s) affected)

Это было бы немного более эффективно:

select dateadd(minute, datediff(minute,0, LogTime), LogDate)
FROM  TestTable

Но это предполагает, что ваше поле даты всегда содержит информацию о времени 00:00:00. Если вы хотите быть уверены, что это также удаляется, вы можете использовать:

select dateadd(minute, datediff(minute,0, LogTime), dateadd(day, datediff(day, 0, Logdate),0))
FROM  TestTable
Другие вопросы по тегам