2014-10-20 116 views
0

有一个查询,我得到这个错误:转换为时间格式

转换日期和/或时间从字符串转换失败。 这里的查询:

Select cast(RESULT_APPROVE_FULL_DATE as date) as RESULT_APPROVE_FULL_DATE, dtvl18, cast(RESULT_APPROVE_FULL_DATE as time) as RESULT_APPROVE_FULL_DATE_2, tdvl18 
from #a1 
left join #b1 
on ADNR18=PATIENT_ID 
and INST18=isuf_lab 
and STNR18=request_number 
and cast(RESULT_APPROVE_FULL_DATE as date)= cast(cast(dtvl18 as varchar) as date) 
and cast(RESULT_APPROVE_FULL_DATE as time)=cast(cast(tdvl18 as varchar) as time) 

问题肯定在于最后一句中,因为当我删除它,一切正常),但我需要一个)。也就是说,问题出在tdvl18(decimal(4,0),null)转换为时间格式。 由于可以推断,tdvl18字段看起来像这样,例如:947,1525,2359等。这些十进制值如何转换为时间格式(hh:mm:ss.nnnnnnn)?

谢谢!

+0

请添加一些样本数据和期望的输出,因为它是很难理解如何'947,1525,2359'应被格式化为时间值。 – Tanner 2014-10-20 09:45:16

+0

嗯,947,1525,2359是样本数据。期望的格式 - 09:47:00.0000000,15:25:00.0000000等等可能吗?非常感谢! – Yan 2014-10-20 10:15:29

回答

1

由于SQL Server无法将字符串值识别为有效时间,因此失败。所以,你的当前错误可以被复制:

declare @someval as varchar(10) = '525'  
select cast(@someval as time) 

-- Conversion failed when converting date and/or time from character string. 

如果使用STUFF方法在正确的位置(最后2位)之前格式化与:值,则转换应该适用于你的价值观:

declare @someval as varchar(10) = '525' 
select cast(stuff(@someval, len(@someval) - 1,0, ':') as time) 

-- 05:25:00.0000000 

这似乎直接在十进制值工作过这样就可以避免铸造varchar第一:

declare @someval as decimal(4,0) = 525 
select cast(stuff(@someval, len(@someval) - 1,0, ':') as time) 

-- 05:25:00.0000000 

改变你的最后一句话,这可能会奏效,假设RESULT_APPROVE_FULL_DATE正确地铸造为时间值:

and cast(RESULT_APPROVE_FULL_DATE as time) 
    = cast(stuff(tdvl18, len(tdvl18) - 1,0, ':') as time) 
+0

工作,谢谢! – Yan 2014-10-20 11:06:32

+0

@Yan没问题,如果这解决了您的问题,您可以使用向上/向下投票按钮旁边的勾号标记此答案。 – Tanner 2014-10-20 11:18:03