哪些值使从VARCHAR转换为DATE失败?

问题描述 投票:3回答:2

我正在从键/值表中读取一个值,该值应包含格式为yyyy-MM-dd的NULLABLE日期。

查询的简化版本是。

SELECT CAST(ClaimDate AS DATE) AS ClaimDate
FROM MyTable

这会导致错误消息:

从字符串转换日期和/或时间时转换失败。

我也试过CONVERT(DATE, ClaimDate)无济于事。

现在,除了知道为什么我得到这个错误,我很想知道哪些值导致了这个。

我已经看到了几个关于上面的错误消息的问题。但我没有找到答案来解决我的问题。

当然,建议除了获得不良价值之外的解决方案也受到高度赞赏。

sql-server tsql date
2个回答
8
投票

根据您的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月份的日期。您可能会收到有效但错误的日期!


0
投票

正如其他人所解释的那样,真正的问题是使用varchar而不是date作为类型。这允许将错误数据插入到字段中。修复这个可能是不可能的 - 如果在不同的行中有不同的日期格式的字符串怎么办?

如果文本字段包含非日期字符串,则CAST(ClaimDate AS DATE)可能会失败。在这种情况下,可以忽略行:

SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null

幸运的是,这种类型是datedatetime解析受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以确保无法插入错误值

© www.soinside.com 2019 - 2024. All rights reserved.