检查TSQL中的两个数据时间是否在同一个日历日的好方法是什么?

前端之家收集整理的这篇文章主要介绍了检查TSQL中的两个数据时间是否在同一个日历日的好方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我遇到的问题:我有一个大的查询需要比较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

猜你在找的MsSQL相关文章