У меня есть большая таблица с 1 миллионом + записей. К сожалению, человек, создавший таблицу, решил поставить даты в поле varchar(50)
.Ошибка преобразования даты SQL Server
Мне нужно сделать простое сравнение дат -
datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Но он не на convert()
:
Conversion failed when converting datetime from character string.
Видимо есть что-то в этой области он не нравится, и так как так много записей, я не могу сказать, просто посмотрев на него. Как я могу надлежащим образом дезинфицировать все поле даты, чтобы оно не прерывалось на convert()
? Вот то, что я сейчас:
select count(*)
from MyTable
where
isdate(lastUpdate) > 0
and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Я не озабочен производительности в этом случае. Это будет одноразовый запрос. Изменение таблицы в поле даты и времени не является вариантом.
Я попытался добавить третий аргумент, и это не имеет никакого значения.
Проблема, скорее всего, как хранятся данные, есть только два безопасных форматов; ISO YYYYMMDD; ISO 8601: гггг-мм-дд THH: мм: сс: ммм (без пробелов)
Не будет ли isdate()
чек заботиться об этом?
У меня нет необходимости в точности 100%. Я просто хочу получить большинство записей за последние 30 дней.
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
Поместите СЛУЧАЙ и IsDate внутри функции CONVERT().
Спасибо! Так оно и было.
Вы не указали, какие форматы датируются для поля varchar. Они последовательно отформатированы? Знание формата поможет немного решить проблему. – Kibbee 2008-08-26 14:33:10