Проверьте, является ли значение датой и преобразует ее

Я использую SQL Server 2012

Я получаю данные в определенном формате. Даты являются числовыми (8,0)
Например, 20120101 = YYYYMMDD

В этом поле даты есть строки со значениями, такими как (0,1,2,3,6), а не дата.

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

Теперь работает следующий код, но я надеялся, что есть лучший способ.

(CASE WHEN [invoice_date] LIKE '________' --There are 8 underscores
 THEN convert(datetime, cast([invoice_date] as char(8)))
 END) AS Invoice_Date

Любая помощь будет оценена.

Ответы

Ответ 1

использовать функцию isdate как..

  (CASE WHEN ISDATE (invoice_date) = 1 
             THEN convert(datetime, cast([invoice_date] as char(8)))
             END) AS Invoice_Date

Ответ 2

Вы можете использовать функцию ISDATE, но что делать для значений, не относящихся к дате? В моем предложенном решении вы можете выбрать null:

select 
    (case 
        when ISDATE (invoice_date)=1
        then convert(datetime, invoice_date)
    else null end) AS Invoice_Date
from your_table

Ответ 3

IsDate

Возвращает 1, если выражение является допустимым значением даты, времени или даты и времени; в противном случае 0. ISDATE возвращает 0, если выражение является значением datetime2.

Пожалуйста, посетите

Ответ 4

Вы можете пойти с TRY CATCH

DECLARE @Source             char(8)
DECLARE @Destination        datetime

set @Source='07152009'
BEGIN TRY
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)        -- YYYY
                                      +LEFT(@Source,2)        -- MM
                                      +SUBSTRING(@Source,3,2) -- DD
                             )
END TRY
BEGIN CATCH
    PRINT 'ERROR!!!'  
END CATCH

SELECT @Source AS Source, @Destination AS Destination