【问题标题】:SQl Server Converting to Date fails , DateTime worksSQl 服务器转换为日期失败,日期时间有效
【发布时间】:2019-07-02 11:55:55
【问题描述】:

我有一个带有 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 转换?

【问题讨论】:

  • select max(try_convert(date,inputDate)) from gooddates
  • 检查字段中是否有多余的字符。如果格式为“mm/dd/yyyy”,则不应超过 10 个字符。尝试使用 DATALENGTH,而不是 LEN,因为那样不会给你尾随空格 SELECT * FROM myTable WHERE DATALENGTH(inputDate) > 10

标签: sql sql-server


【解决方案1】:

我的猜测是,您的值包含日期之后的时间戳(基于 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;

【讨论】:

  • '05/02/ 18' 是有问题的值。事后看来,我检查了前导和尾随空格。只是给跟随的任何人的注释...如果您收到 TRY_CONVERT 不是内置函数的错误,请检查您的兼容性级别。必须 >=12
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多