Ответ 1
использовать функцию isdate как..
(CASE WHEN ISDATE (invoice_date) = 1
THEN convert(datetime, cast([invoice_date] as char(8)))
END) AS Invoice_Date
Я использую 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
Любая помощь будет оценена.
использовать функцию isdate как..
(CASE WHEN ISDATE (invoice_date) = 1
THEN convert(datetime, cast([invoice_date] as char(8)))
END) AS Invoice_Date
Вы можете использовать функцию ISDATE, но что делать для значений, не относящихся к дате? В моем предложенном решении вы можете выбрать null:
select
(case
when ISDATE (invoice_date)=1
then convert(datetime, invoice_date)
else null end) AS Invoice_Date
from your_table
IsDate
Возвращает 1, если выражение является допустимым значением даты, времени или даты и времени; в противном случае 0. ISDATE возвращает 0, если выражение является значением datetime2.
Вы можете пойти с 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