Sql server 根据where子句,字符到日期的转换失败

Sql server 根据where子句,字符到日期的转换失败,sql-server,date,date-conversion,Sql Server,Date,Date Conversion,我正在尝试对我的数据设置一个简单的查询,将char yyymmdd转换为date类型。我使用的是简单转换(日期,MyDateColumn) 我注意到,根据我是否将where子句添加到MyDateColumn,对于上面的特定行,此查询已失败。我添加了where子句MyDateColumn=MyDateColumn作为解决方法。有没有更好的解决方案 我正在使用SQL Server 2016(13.0.5201.2)。MyDateColumn是char(10)类型的这里最好的解决方案是停止将日期存储为

我正在尝试对我的数据设置一个简单的查询,将char yyymmdd转换为date类型。我使用的是简单转换(日期,MyDateColumn)

我注意到,根据我是否将where子句添加到MyDateColumn,对于上面的特定行,此查询已失败。我添加了where子句MyDateColumn=MyDateColumn作为解决方法。有没有更好的解决方案


我正在使用SQL Server 2016(13.0.5201.2)。MyDateColumn是char(10)类型的

这里最好的解决方案是停止将日期存储为文本,而是开始使用实际的日期列。第一次查询中的转换失败令人震惊,这似乎表明您存储了非日期,或者可能存在一些尾随/前导空格。由于您使用的是SQL Server 2016,您可以尝试以下查询以清除任何不一致的日期字符串:

SELECT MyDateColumn
FROM MyTable
WHERE TRY_CONVERT(datetime, MyDateColumn) IS NULL;

找到有问题的记录后,您可以修复它们,然后再试一次。

什么日期是
'000000'
表示的?您说您有一个名为
MyDateColumn
的列,但如果它已经是
date
,为什么要将其转换为
date
?MyDateColumn是char(10)列。MyTimeColumn'000000'实际上与该案例无关。我只是指出另一个可能会影响我的结果的过滤器将日期存储为文本是ERP系统集成的遗留问题。有时我会在ERP的日期列中得到奇怪的非日期文本值。上面的查询是ETL清理数据的一部分。但实际上你的想法让我明白了,TRY_CONVERT是正确的。我唯一的问题是我已经设置了SQL 2008的兼容性级别,因此TRY_CONVERT函数无法识别。太好了,如果我给你的查询提供了一个空集,那么这意味着你的日期都是可解析的。请注意,您也可以使用多种日期格式,使用这些格式,
TRY\u CONVERT
可能比常规的
CONVERT
更好地处理。
SELECT MyDateColumn
FROM MyTable
WHERE TRY_CONVERT(datetime, MyDateColumn) IS NULL;