SQL server日期转换提供错误

SQL server日期转换提供错误,sql,sql-server-2008,Sql,Sql Server 2008,我有以下疑问: select A.ACCOUNT_NUM, convert(date, B.EFFECTIVE_DATE, 112) as 'EFFECTIVE_DATE', B.INTEREST_RATE from Table1 A left join Table2 B on A.ACCOUNT_NUM = B.ACCOUNT_NUM 两个表中的ACCOUNT_NUM均为varchar(12),生效日期为varchar(8),格式为“20131018” 这给了我一

我有以下疑问:

select A.ACCOUNT_NUM,
       convert(date, B.EFFECTIVE_DATE, 112) as 'EFFECTIVE_DATE',
       B.INTEREST_RATE
from Table1 A
left join Table2 B
on A.ACCOUNT_NUM = B.ACCOUNT_NUM
两个表中的ACCOUNT_NUM均为varchar(12),生效日期为varchar(8),格式为“20131018” 这给了我一个“转换日期和/或时间字符串时转换失败”。如果我在没有转换的情况下运行查询,它会正常运行

但是,我已经使用ISDATE()检查了生效日期的内容,没有任何问题。 此外,如果我执行以下操作:

select A.ACCOUNT_NUM,
       B.EFFECTIVE_DATE,
       B.INTEREST_RATE
into #temp
from Table1 A
left join Table2 B
on A.ACCOUNT_NUM = B.ACCOUNT_NUM


select convert(date, EFFECTIVE_DATE, 112)
from #temp
它正确地将列转换为日期格式,没有错误。 请问我错过了什么,这让我发疯,我相信这很简单


谢谢

我刚刚重新创建了您的模式并运行了您的查询,结果很好。毫无疑问,问题是您的
表2.EFFECTIVE_DATE
列中的字符串格式不正确。

字符串类型字段中存储
日期时,可能会出现此类问题。列中可能有一个或两个字符串不能转换为日期。用
CASE
试试这个,看看你是否得到了数据

SELECT A.ACCOUNT_NUM,
       CASE WHEN ISDATE(B.EFFECTIVE_DATE) THEN CONVERT(DATE, B.EFFECTIVE_DATE, 112) 
            ELSE CONVERT(DATE, '20000101', 112) END AS 'EFFECTIVE_DATE',
       B.INTEREST_RATE
FROM Table1 A
LEFT JOIN Table2 B ON A.ACCOUNT_NUM = B.ACCOUNT_NUM
如果将任何
生效日期
值设置为
2000-01-01
,则意味着您必须对这些字符串值进行排序

此外,您还可以尝试以下查询,以找出导致问题的行:

SELECT B.ACCOUNT_NUM, B.EFFECTIVE_DATE
FROM Table2 B
WHERE ISDATE(B.EFFECTIVE_DATE) = 0

如果在EFFECTIVE_DATE列中的字符串格式不正确,那么我发布的第二个代码块中是否也会出现错误?因为第二个很好用不因为没有转换发生,它正在将VARCHAR值复制到temp表中的一个新VARCHAR列中。很抱歉,我的意思是,如果我同时运行select convert from#temp它工作正常,您是否可以将数据集发布到某个位置?我尝试了这两种建议,但没有发现异常。不,所有返回的日期都是从今年开始的,因为expectedIt很困难不看照片就说。我的错,我想这只是我是个傻瓜。我只检查了join返回的600多行中日期字符串的有效性。如果我在查询中添加
where isdate(B.EFFECTIVE_DATE)=1
,它就可以正常工作。转换显然是在首先应用join?过滤器之前执行的,这就是为什么添加WHERE子句时转换会起作用。看一下执行计划,从右到左阅读。