有一个查询,我收到此错误:
从字符串转换日期和/或时间时转换失败。 这是查询:
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(十进制(4,0),null)转换为时间格式。 可以推断,tdvl18字段看起来像这样,例如:947,1525,2359等。如何将这些十进制值转换为时间格式(hh:mm:ss.nnnnnnn)?
谢谢!
答案 0 :(得分: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)