日期:2014-05-17  浏览次数:20536 次

关于sql server 的时间拼接问题
本帖最后由 zolox 于 2013-10-21 15:17:02 编辑
declare @test datetime,
@test2 varchar(20),
@len int,
@lengetdate int 
select top 1 
@test = (substring(convert(varchar,ceDate,120),1,11)+ceTime),
@test2=cetime,
@len = len(substring(convert(varchar,ceDate,120),1,11)+ceTime),
@lengetdate = len(getdate())
from T_XX
where (substring(convert(varchar,ceDate,120),1,11)+ceTime) < getdate()
order by (substring(convert(varchar,ceDate,120),1,11)+ceTime) desc
print @test
print @test2
print @len
print @lengetdate
print getdate()



遇到一张比较奇怪的表结构,其中ceDate 是个datetime 类型的,单只是存了日期,如
2013-08-28 00:00:00.000 而ceTime 是存放的是时间,如 '12:18:10',格式未varchar(8)。测试的时候发现其拼接出来的可以赋值给datetime 类型变量,但是不能用于比较...一比较就报了char 转datetime类型越界问题。求解决方案

------解决方案--------------------
那个不是dateadd(dd,-1000,getdate())的错,是匹配的时候错而已,把where中的所有判断条件全部转换成同一个类型是解决的思路
------解决方案--------------------
数据类型存在显式和隐式转换,赋值的时候会转换类型,但是匹配的时候,如果匹配的左右两段类型不一致,就报错
------解决方案--------------------
select top 1 cedate+cetime from T_FANGKA_XUNGENG
where (CONVERT(VARCHAR(30),ceDate,121)+cetime)>convert(varchar(30),GETDATE(),121)
这个地方,大于号的左边已经转换成字符型,但是以日期格式显示,只是实际上它已经是字符串,而如果右边不转换的话,就是日期型,就好像a和1对比,哪个大?不好给结论吧?只有转换类型才有可并行
------解决方案--------------------
引用:
Quote: 引用:

试试这个行吗:

declare @t table(ceDate datetime,ceTime varchar(8))

insert into @t 
values('2013-08-28 00:00:00.000','12:18:10')


declare @test datetime,
@test2 varchar(20),
@len int,
@lengetdate int 
select top 1 
@test = (substring(convert(varchar,ceDate,120),1,11)+ceTime),
@test2=cetime,
@len = len(substring(convert(varchar,ceDate,120),1,11)+ceTime),
@lengetdate = len(getdate())
from @t
where (substring(convert(varchar,ceDate,120),1,11)+ceTime) < getdate()
order by (substring(convert(varchar,ceDate,120),1,11)+ceTime) desc
print @test
print @test2
print @len
print @lengetdate
print getdate()


居然可以,这和我的代码有差么


因为你的语句时进行类型转化后,与getdate()进行比较的,走的应该是表扫描,可能是扫描到了有问题的数据,就报错了。

你运行这个,看看时分秒,都对不:
select ceDate,ceTime,
       --left(ceTime,charindex(':',ceTime)-1),
       substring(ceTime,1,2) as h,
       substring(ceTime,4,2) as m,
       substring(ceTime,7,2) as s
from T_XX