将 VarChar 转换为 DateTime 并跳过具有无效日期的记录

Joh*_*nes 0 sql-server sql-server-2012

我有以下数据集:

CISS_STATUS       SVCDAT    BRANCD
                     .        68
                     .        68
R                    .        68
R                    .        68
                     .        68
                     .        68
                     .        22
R               01/01/2013    65
A               01/01/2014    22
A               01/01/2015    32
Run Code Online (Sandbox Code Playgroud)

大约有 500K 条记录和 60 个其他字段,但您明白了。无论如何,我想要做的是基于 SVCDAT(这是一种 VarChar(10) 数据类型)编写一个 WHERE 子句,排除其中没有有效日期的记录(即其中带有点的记录)。

当我尝试类似的事情时:

WHERE convert(datetime,SVCDAT,1) > '1/1/1900'
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时:

WHERE CAST(SVCDAT as smalldatetime) > '1/1/1900'
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

The conversion of a varchar data type to a smalldatetime data type resulted in 
an out-of-range value.
Run Code Online (Sandbox Code Playgroud)

有人对如何解决这个问题有任何想法吗?

dar*_*rio 5

由于您使用的是 SQL Server 2012,因此可以使用TRY_CONVERT. 如果值无法转换,则返回 NULL:

WHERE TRY_CONVERT(datetime, SVCDAT, 1) > '1/1/1900'
Run Code Online (Sandbox Code Playgroud)

更多信息请参见此处