Оба этих формата даты конвертируются просто отлично. Алгоритм convert
по умолчанию делает довольно приличную работу, проявляя гибкость в отношении того, что ему дают. И null
строка, как я прокомментировал ранее , will always convert to a
null datetime value: per the standard, any expression that involving
null yields
null`.
Я подозреваю, что у вас проблема с данными. Скорее всего, ненужные символы, такие как встроенные символы CR, LF или CR + LF (разрывы строк). Символы HT (табуляция) также, кажется, ломаются convert()
. Возможно, вам (или вашим администраторам баз данных) необходимо выполнить очистку данных, чтобы избавиться от ненужных символов. Или вам нужно обойти проблему и написать некрасивое выражение, чтобы исправить неверные данные во время выполнения.
Запрос, подобный этому, должен идентифицировать данные проблемы:
select myCruftyDateTimeColumn,count(*)
from foo
where myCruftyDateTimeColumn is not null
-- m/d/yyyy hh:mm:ss AM format
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9][0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9][0-9], [0-9][0-9][0-9][0-9]'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9], [0-9][0-9][0-9][0-9]'
group by myCruftyDateTimeColumn
order by 1
Возможно, вы захотите загрузить временную таблицу с результатами, а затем, с этого
select *,convert(varbinary,myCruftyDateTimeColumn)
from #bad_data
, чтобы точно идентифицировать поддельные символы.