将字符串 YYYY-MM-DD 转换为日期数据类型并处理转换错误

Convert string YYYY-MM-DD to date datatype and handle conversion errors

我在 SQL Server 2008 SP4 table 中有 4 个字符串数据类型的列应该是日期。我无法更改它,所以我需要一种方法将这些字符串转换为日期。该字符串的格式为 "YYYY-MM-DD".

对于这些列中的 2 列,CONVERT(datetime, [columname], 101) 有效,但其他 2 列的字符串类似于“1700-01-01”,当我尝试转换它们时,它显示转换不符合-范围错误。

我希望所有字符串值都转换为日期,如果转换失败我宁愿将其作为空白或任何其他方式,我接受处理日期转换错误时的建议。此 table 将广泛用于 C#/VBA 和 excel 查询中的应用程序。专门针对 Excel,我需要一种友好的方式来在查询中显示此转换错误。

如果无法转换,您可以使用 TRY_CONVERT() which returns null:

TRY_CONVERT(datetime, '1700-01-01', 101)

将 return null 而不是错误。
我认为这适用于 SQL Server 2012+
如果您的版本不支持它,您可以检查字符串的年份部分并执行如下操作:

case 
  when left([columname], 4) < '1753' then null
  else CONVERT(datetime, [columname], 101)
end

根据SQL服务器版本,您可以尝试使用:

TRY_CONVERT(DATETIME, [columnname], 101)

这不会失败,而是会生成一个 NULL 值,然后您可以优雅地处理该值。

我没发现您使用的是 SQL Server 2008。您可以尝试使用 ISDATE() 功能。

SELECT CASE ISDATE('1700-01-01')
        WHEN 1 THEN CONVERT(DATETIME, '1700-01-01', 101)
        ELSE NULL
    END AS Converted

这可能是您可以使用的最佳方式。我不是 100% 确定 ISDATE() 是否总是表现正确,因为 ISNUMERIC() 有问题。