Проблемы с SQL Server 2000 при преобразовании nvarchar в datetime - PullRequest
0 голосов
/ 24 мая 2011

Внутри таблицы есть столбец с типом данных datetime, и мне нужно сравнить данные в этом столбце с текущими датой и временем.

Я пытаюсь конвертировать в поле, но я получаю

Syntax error converting datetime from character string

К сожалению, значения в столбце имеют три разных формата (устаревший мусор)

November 28, 2005 -or-
5/1/2011 12:00:00 AM -or-
null

Мой код, который я использую, выглядит следующим образом:

SELECT 1 from webprograms where convert(datetime, ApplicationDueDate) < getdate()

Может кто-нибудь помочь диагностировать проблему, пожалуйста

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Оба этих формата даты конвертируются просто отлично. Алгоритм 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

, чтобы точно идентифицировать поддельные символы.

0 голосов
/ 24 мая 2011

Можете ли вы перейти на более новую версию SQL Server? Если это так, проблема излечится сама собой. Если нет, вы должны исключить нули из уравнения, так как они являются проблемой здесь.

Я не думаю, что это имеет значение, если ваш топ 1 выбирает нуль или нет, так как я думаю, что оценка не удалась, так как столбец обнуляем. Я провел быстрый тест в SQL Server 2008 R2, и он отлично работает.

...