Sql server 2008 将整型字段转换为日期时间

Sql server 2008 将整型字段转换为日期时间,sql-server-2008,datetime,select,case,Sql Server 2008,Datetime,Select,Case,例如,Im使用MSSQL 2008,有一个名为AbsoluteDates的字段,其中包含mat的数字数据 AbsoluteDates 20051216 20051217 20051218 10000 90 600 我需要做的是一个“Select”语句,它将忽略任何长度不是8个数字的日期,然后将结果转换为datetime,因为它应该像一个case语句,因为当长度不是8个字符时,我需要生成一些内容,例如单词“NotValid” 例如,从Calendar中选择AbosluteDates,其中lent

例如,Im使用MSSQL 2008,有一个名为AbsoluteDates的字段,其中包含mat的数字数据

AbsoluteDates
20051216
20051217
20051218
10000
90
600
我需要做的是一个“Select”语句,它将忽略任何长度不是8个数字的日期,然后将结果转换为datetime,因为它应该像一个case语句,因为当长度不是8个字符时,我需要生成一些内容,例如单词“NotValid”

例如,从Calendar中选择AbosluteDates,其中lenth=9将给出以下结果,如果我有与上面相同的数据

AbsoluteDates
2005-12-16 00:00:00.000
2005-12-17 00:00:00.000
2005-12-18 00:00:00.000
NotValid
NotValid
NotValid

您可以先将日期时间转换为varchar,然后再转换回varchar:

SELECT CASE WHEN LEN(DateNumber) = 8 AND ISDATE(RTRIM(DateNumber)) = 1
    THEN CONVERT(nvarchar(25), 
        CAST(CAST(DateNumber as varchar(10)) as datetime), 121)
    ELSE 'NotValid' 
    END AS Result
FROM (
    SELECT 20051216 AS DateNumber
    UNION SELECT 20051217
    UNION SELECT 20051218
    UNION SELECT 10000
    UNION SELECT 90
    UNION SELECT 600
    UNION SELECT 99421946
) MySubQuery
ORDER BY Result

只需将硬编码搜索替换为实际数据表

您可能还需要将
ISDATE(RTRIM(DateNumber))=1
添加到
案例
,因为
99421946
将通过你的测试。你可以简化它,在第一个
案例中使用
,而不是添加一个额外的
案例
树,因为
其他的
会导致相同的结果。出于某种原因,我在脑海中想,在一个案例陈述中不能有多个陈述;及时更新。