SQL服务器日期转换给出错误

时间:2013-10-18 09:42:51

标签: 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),EFFECTIVE_DATE是varchar(8),格式为'20131018' 这给了我'转换日期和/或时间字符串时转换失败'。如果我在没有转换的情况下运行查询,它运行正常。

但是我已经使用ISDATE()检查了EFFECTIVE_DATE的内容,并且没有问题。 另外,如果我执行以下操作:

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 个答案:

答案 0 :(得分:1)

当您将DATE 存储在 STRING type fields中时,可能会出现这类问题。您的列中可能有一个或两个字符串不可转换为日期。使用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

如果您将任何EFFECTIVE_DATE值设为2000-01-01,则表示您必须对这些字符串值进行排序。

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

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

答案 1 :(得分:0)

我刚刚重新创建了您的架构并运行了您的查询,它运行正常。毫无疑问,问题是Table2.EFFECTIVE_DATE列中格式错误的字符串。