这是我遇到的问题:我有一个大的查询需要比较where子句中的datetimes来查看两个日期是否在同一天.我目前的解决办法是将数据库发送到UDF,将它们转换为同一天的午夜,然后检查这些日期是否相等.当涉及到查询计划时,这是一个灾难,几乎所有UDF都在连接或where子句中.这是我的应用程序中唯一的一个地方,我无法根除功能,并给查询优化器一些实际可用的位置来找到最佳索引.
我想我在这里遗漏了一些简单的东西.
这里有参考的功能.
if not exists (select * from dbo.sysobjects where id = object_id(N'dbo.f_MakeDate') and type in (N'FN',N'IF',N'TF',N'FS',N'FT')) exec('create function dbo.f_MakeDate() returns int as begin declare @retval int return @retval end') go alter function dbo.f_MakeDate ( @Day datetime,@Hour int,@Minute int ) returns datetime as /* Creates a datetime using the year-month-day portion of @Day,and the @Hour and @Minute provided */ begin declare @retval datetime set @retval = cast( cast(datepart(m,@Day) as varchar(2)) + '/' + cast(datepart(d,@Day) as varchar(2)) + '/' + cast(datepart(yyyy,@Day) as varchar(4)) + ' ' + cast(@Hour as varchar(2)) + ':' + cast(@Minute as varchar(2)) as datetime) return @retval end go
为了使事情变得复杂,我正在加入时区表,以查看当地时间的日期,每一行可能会有所不同:
where dbo.f_MakeDate(dateadd(hh,tz.Offset + case when ds.LocalTimeZone is not null then 1 else 0 end,t.TheDateINeedtocheck),0) = @activityDateMidnight
[编辑]
我结合了@ Todd的建议:
where datediff(day,dateadd(hh,@ActivityDate) = 0
我对于日常工作的误解(连续几年的同一天产生366,而不是我预期的那样)使我浪费了大量的精力.
但查询计划没有改变.我想我需要回到绘图板整个事情.
解决方法
这更简明扼要:
where datediff(day,date1,date2) = 0