我正在从键/值表中读取一个值,该值应包含格式为yyyy-MM-dd
的NULLABLE日期。
查询的简化版本是。
SELECT CAST(ClaimDate AS DATE) AS ClaimDate
FROM MyTable
这会导致错误消息:
从字符串转换日期和/或时间时转换失败。
我也试过CONVERT(DATE, ClaimDate)
无济于事。
现在,除了知道为什么我得到这个错误,我很想知道哪些值导致了这个。
我已经看到了几个关于上面的错误消息的问题。但我没有找到答案来解决我的问题。
当然,建议除了获得不良价值之外的解决方案也受到高度赞赏。
根据您的SQL Server版本(2012+),您可以使用TRY_CONVERT:
SELECT ClaimDate
FROM MyTable
WHERE TRY_CONVERT(DATE, ClaimDate ) IS NULL
AND ClaimDate IS NOT NULL
这将为您提供无法转换为日期的值,您将如何解决这些问题是另一个问题。此外,可以转换2019-01-12
的值,但如果它在字符串中,则无法确定这是12月份还是1月份的日期。您可能会收到有效但错误的日期!
正如其他人所解释的那样,真正的问题是使用varchar
而不是date
作为类型。这允许将错误数据插入到字段中。修复这个可能是不可能的 - 如果在不同的行中有不同的日期格式的字符串怎么办?
如果文本字段包含非日期字符串,则CAST(ClaimDate AS DATE)
可能会失败。在这种情况下,可以忽略行:
SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null
幸运的是,这种类型是date
。 datetime
解析受DATEFORMAT设置的影响。如果它设置为YDM,则此行仍然有效:
set dateformat ydm;
select cast('2019-03-14' as date);
虽然这会抛出
set dateformat ydm;
select cast('2019-03-14' as datetime);
如果价值是2019-03-04
,那将会更糟。演员不会投掷,而是会返回错误的日期。
幸运的是,来自DATEFORMAT的评论:
Date,datetime2和datetimeoffset数据类型不支持DATEFORMAT ydm。
这就是为什么应首先检查失败的数据
SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null
如果一切正常,则应将类型更改为date
以确保无法插入错误值