对于存放时间格式为2003090709:56:00
转换为datetime类型方法:CAST( STUFF(a.cyrq,9,0,' ') AS DATETIME) 结果为 2003-09-07 09:56:00.000
而将标准datetime类型转换为字符型方法为:
declare @begin DATETIME
set @begin='2003-09-07 09:56:00'
SELECT convert(varchar(8),@begin,112)+convert(varchar(8),@begin,8) 结果为 2003090709:56:00
对于存放时间格式为varchar(16)
在进行时间搜索时,是用varchar(16)转换为datetime进行搜索 还是varchar(16)不转换与将条件转换为相同的varchar类型 哪个匹配快呢?
进行了实验,随机添加日期100w条数据
DECLARE @date_from DATETIME; --开始日期
DECLARE @date_to DATETIME; --结束日期
declare @temp datetime;
declare @i int;
SET @date_from = '2000-10-01';
SET @date_to = '2011-12-30';
set @i=1
while @i<1000000
begin
set @temp= @date_from +(ABS(CAST(CAST( NewID() AS BINARY(8) )AS INT)) %CAST((@date_to - @date_from)AS INT))
insert into tbtest SELECT @i,convert(varchar(8),@temp,112)+convert(varchar(8),@temp,8)
set @i=@i+1
end
进行搜索:
declare @runTime datetime
set @runTime=getdate()
select count(*) from tbtest
where CAST( STUFF(begintime,9,0,' ') AS DATETIME) between '2000-12-23 00:00:00' and '2005-01-01 00:00:00 '
select [语句执行花费时间(毫秒)]=datediff(ms,@runTime,getdate())
结果为358344 用时3293ms
declare @runTime datetime
set @runTime=getdate()
DECLARE @date_from DATETIME; --开始日期
DECLARE @date_to DATETIME; --结束日期
set @date_from='2000-12-23 00:00:00'
set @date_to='2005-01-01'
select count(*) from tbtest
where begintime between convert(varchar(8),@date_from,112)+convert(varchar(8),@date_from,8) and convert(varchar(8),@date_to,112)+convert(varchar(8),@date_to,8)
select [语句执行花费时间(毫秒)]=datediff(ms,@runTime,getdate())
结果 358344 用时376ms
从而得出结果,将varchar(16)不转换与将条件转换为相同的varchar类型得到的结果快些。
经常有人写sql为
select b.item
from a,b
where a.id*=b.id ----这样的意思为 LEFT OUTER JOIN b 也可以写为 a.id=*b.id意思为 A RIGHT OUTER JOIN b
like的占位符为_,,不过必须将_符合字段存储的长度一样才可以准确搜索出字段。