我有以下查询:
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
它正确地将列转换为日期格式,没有错误。 我错过了什么,它让我发疯,我确信这很简单!
由于
答案 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
列中格式错误的字符串。