我正在使用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
任何帮助将不胜感激。
答案 0 :(得分:21)
使用isdate函数 喜欢..
(CASE WHEN ISDATE (invoice_date) = 1
THEN convert(datetime, cast([invoice_date] as char(8)))
END) AS Invoice_Date
答案 1 :(得分:4)
你可以使用ISDATE函数,但是对于非日期值会怎么做?在我建议的解决方案中,您可以选择返回null:
select
(case
when ISDATE (invoice_date)=1
then convert(datetime, invoice_date)
else null end) AS Invoice_Date
from your_table
答案 2 :(得分:2)
答案 3 :(得分:0)
您可以使用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