关于sql server 的时间拼接问题本帖最后由 zolox 于 2013-10-21 15:17:02 编辑declare @test datetime,@te
关于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