У меня большая таблица с 1 миллионами + записей. К сожалению, создатель таблицы решил поместить даты в поле varchar(50)
.
Мне нужно сделать простое сравнение дат -
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
@ SQLMenace
Меня не беспокоит производительность в этом случае. Это будет одноразовый запрос. Изменение таблицы на поле даты и времени не является обязательным.
@ Джон Лимджап
Я попытался добавить третий аргумент, и это не имеет значения.
@ SQLMenace
Проблема скорее всего в том, как хранятся данные, есть только два безопасных формата; ИСО ГГГГММДД; ISO 8601 гггг-мм-дд чч: мм: сс: ммм (без пробелов)
Разве проверка isdate()
не позаботится об этом?
Мне не нужна точность 100%. Я просто хочу получить большинство записей за последние 30 дней.
@ SQLMenace
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
@ Brian Schkerke
Поместите CASE и ISDATE в функцию CONVERT ().
Спасибо! Это сделал это.