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



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

对于其中 2 列,一个CONVERT(datetime, [columname], 101)有效,但其他 2 个具有类似于"1700-01-01"的字符串,当我尝试转换它们时,它显示转换超出范围错误。

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

您可以使用TRY_CONVERT(),如果无法转换,则返回null

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

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

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

根据 SQL Server 版本,您可以尝试使用:

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()有问题。

最新更新