В 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