首页 > 解决方案 > SQl 服务器转换为日期失败,日期时间有效

问题描述

我有一个varchar(25)包含日期值的列的表。典型值为“2017 年 11 月 4 日”。

此查询返回 0 行

select * 
from myTable  
where isdate(inputDate) = 0

我试图找到一个最大值,使用日期排序。

此查询返回预期结果

;with gooddates as 
(
    select 
        medcomfolder, PatientId, PatientBirthday, InputDate 
    from 
        myTable 
    where 
        isdate(inputDate) = 1
)
select max(convert(datetime, inputDate)) 
from gooddates

此查询返回错误。

;with gooddates as 
(
     select 
         medcomfolder, PatientId, PatientBirthday, InputDate 
     from 
         dwhFuData   
     where 
         isdate(inputdate) = 1
)
select max(convert(date, inputdate)) 
from gooddates

这是返回的错误

消息 241,级别 16,状态 1,行 274
从字符串转换日期和/或时间时转换失败

这两个查询之间的区别在于,第一个是转换为 dateTime,而后者是转换为一个日期。

此时,我可以使用 dateTime 选项继续前进,但我想知道我错过了什么。

我检查过没有嵌入空格,并且所有列都有一个 len(InputDate) = 10 (不包括时间数据)

我选择了不同的值,将它们放入 excel 中,并在每一行上做了一个日期函数。我希望在 1 行获得#VALUE。所有行都有效。

所以没有什么像“2019 年 2 月 31 日”这样愚蠢的事情发生。

当简单的日期转换不通过时,如何通过 dateTime 转换?

标签: sqlsql-server

解决方案


我的猜测是,您的值包含日期之后的时间戳(基于isdate()始终为零的事实)。

如果是这样,一个简单的解决方案是使用convert(date, left(inputdate, 10)). 另一种解决方案使用try_convert()

try_convert(date, inputdate)

要找到有问题的值:

select inputdate
from dwhFuData
where try_convert(date, inputdate) is null and inputdate is not null;

推荐阅读