【发布时间】:2010-09-23 19:03:34
【问题描述】:
我有两个“日期”字段需要加入。
第一个是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
哪个更好?还是有更好的办法?
已编辑以显示费用
--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
【问题讨论】:
-
执行计划中的操作员成本没有意义。您需要使用
SET STATISTICS IO ON运行每个一百万次左右并进行比较。我想你会发现其中大部分都差不多。
标签: sql sql-server performance sql-server-2008