检查TSQL中的两个数据时间是否在同一个日历日的好方法是什么?
发布时间:2020-12-12 16:44:47 所属栏目:MsSql教程 来源:网络整理
导读:这是我遇到的问题:我有一个大的查询需要比较where子句中的datetimes来查看两个日期是否在同一天.我目前的解决办法是将数据库发送到UDF,将它们转换为同一天的午夜,然后检查这些日期是否相等.当涉及到查询计划时,这是一个灾难,几乎所有UDF都在连接或where子句
这是我遇到的问题:我有一个大的查询需要比较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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |