Я пытаюсь преобразовать столбец как 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
branwen85 23 Фев 2015 в 22:31

2 ответа

Лучший ответ

Вы можете использовать isdate, чтобы получить список всех, которые не конвертируются для вас. Вам не нужно менять тип столбца, чтобы использовать это, поэтому я смущен вашим утверждением

если столбец был в формате даты, я мог бы проверить его с помощью ISDATE (), но, к сожалению, я не могу изменить тип столбца (у меня нет разрешений)

Поможет больше, если вы можете уточнить, но этот запрос должен предоставить вам список строк с неправильными значениями даты.

select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0
8
workabyte 23 Фев 2015 в 19:36

Добавив к ответу @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
4
Omega Kewt 6 Фев 2018 в 15:51