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