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