Я пытаюсь преобразовать столбец как smalldatetime
из varchar
. Есть строки, содержащие ошибки, как их найти?
SELECT
PA.EAR_TAG
,ISNULL(B.DISPOSAL_DATE, H.DISPOSAL_DATE) as HB_Date
,Y.[DATE OF MOVEMENT] as Y_Date
,DATEDIFF(DAY, ISNULL(B.DISPOSAL_DATE, H.DISPOSAL_DATE), cast(Y.[DATE OF MOVEMENT] as smalldatetime))
FROM
DairyTelomere.dbo.PROJECT_ANIMALS AS PA
LEFT JOIN
Langhill.dbo.YOUNG_STOCK_BULL AS B ON Pa.EAR_TAG = B.EAR_TAG
LEFT JOIN
Langhill.dbo.YOUNG_STOCK_HEIFER AS H ON PA.EAR_TAG = H.EAR_TAG
LEFT JOIN
DairyTelomere.dbo.Young_Stock_culls AS Y ON PA.EAR_TAG = Y.Ear_Tag
Я получаю следующую ошибку:
Сообщение 242, уровень 16, состояние 3, строка 1
Преобразование типа данных varchar в тип данных smalldatetime привело к значению вне допустимого диапазона.
Я знаю, что если бы столбец был в формате даты, я мог бы проверить его с помощью ISDATE()
, но, к сожалению, я не могу изменить тип столбца (у меня нет разрешений).
Мы будем благодарны за любые идеи.
2 ответа
Вы можете использовать isdate, чтобы получить список всех, которые не конвертируются для вас. Вам не нужно менять тип столбца, чтобы использовать это, поэтому я смущен вашим утверждением
если столбец был в формате даты, я мог бы проверить его с помощью ISDATE (), но, к сожалению, я не могу изменить тип столбца (у меня нет разрешений)
Поможет больше, если вы можете уточнить, но этот запрос должен предоставить вам список строк с неправильными значениями даты.
select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0
Добавив к ответу @workabyte, вы также можете попробовать использовать TRY_PARSE
, TRY_CAST
ИЛИ TRY_CONVERT
, все они возвращают NULL
, если преобразование не удалось, таким образом вы можете узнать, какие строки вызвали Ошибка.
TRY_PARSE
Как сказано в документации :
Используйте TRY_PARSE только для преобразования из строки в типы даты / времени и числа. Для преобразования общего типа продолжайте использовать CAST или CONVERT. Имейте в виду, что при синтаксическом анализе строкового значения возникают определенные накладные расходы.
Пример использования:
SELECT TRY_PARSE(your_date AS DATETIME USING 'es-ES') as date
FROM your_table
es-ES
- параметр культуры, разные параметры культуры дают разные результаты в ваших преобразованиях, полный список параметров можно найти в документации.
< Сильный > TRY_CONVERT
Как сказано в документации :
TRY_CONVERT принимает переданное ему значение и пытается преобразовать его в указанный data_type. Если приведение выполнено успешно, TRY_CONVERT возвращает значение как указанный data_type; при возникновении ошибки возвращается значение null. Однако, если вы запрашиваете преобразование, которое явно не разрешено, TRY_CONVERT завершается ошибкой.
Пример использования:
SELECT TRY_CONVERT(DATETIME,your_date,103) as date
FROM your_table
103 - это стиль / формат даты, которую вы конвертируете, здесь вы можете найти список доступных форматов
TRY_CAST
Как сказано в документации :
TRY_CAST принимает переданное ему значение и пытается преобразовать его в указанный data_type. Если приведение выполнено успешно, TRY_CAST возвращает значение как указанный data_type; при возникновении ошибки возвращается значение null. Однако, если вы запрашиваете явно запрещенное преобразование, TRY_CAST завершается ошибкой.
Пример использования:
SELECT TRY_CAST(your_date AS DATETIME) as date
FROM your_table
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.