检查值是否为日期并进行转换

时间:2013-05-03 07:02:42

标签: sql sql-server date sqldatetime

我正在使用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

任何帮助将不胜感激。

4 个答案:

答案 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)

<强> ISDATE

如果表达式是有效的日期,时间或日期时间值,则返回1;否则,0。 如果表达式是datetime2值,则ISDATE返回0。

Please visit

答案 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