Nix*_*Nix 4 sql sql-server performance sql-server-2008
我有两个"日期"字段需要加入.
第一种是格式的正常日期时间 yyyy-mm-dd hh:mm:ss
第二个是红头步骤子格式的varchar(8) mmddyyyy
现在这变得很痛苦,因为没有简单的方法可以转换为相应的类型.有一种内置格式,yyyymmdd但与varchar格式不匹配.
我可以看到两条路径:
declare @normal_date as datetime;
declare @hated_date as varchar(8);
set @normal_date='1974-11-01 00:00:00.000'
set @hated_date='11011974'
--cast to date time with string splits
select @normal_date
where CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))=@normal_date
--convert normal date to ackward format
select @normal_date
where REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
Run Code Online (Sandbox Code Playgroud)
哪个更好?或者,还有更好的方法?
编辑以显示成本
--Operator cost (39%)
CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))=@normal_date
--Operator cost (57%)
REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
--Operator cost (46%)
cast(stuff(stuff(@hated_date, 3,0, '/'),6,0,'/') as datetime)=@normal_date
--Operator cost (47%)
RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)=@normal_date
Run Code Online (Sandbox Code Playgroud)
这是yyyymmdd没有?
RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)
Run Code Online (Sandbox Code Playgroud)
所以,你的脚本变成了
declare @normal_date as datetime;
declare @hated_date as varchar(8);
set @normal_date='1974-11-01 00:00:00.000'
set @hated_date='11011974'
--SELECT @hated_date = RIGHT(@hated_date, 4) + LEFT(@hated_date, 4))
select 'hurrah' WHERE @normal_date = RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)
Run Code Online (Sandbox Code Playgroud)