开发者社区> 问答> 正文

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

这是我遇到的问题:我有一个大型查询,需要比较where子句中的日期时间以查看两个日期是否在同一天。我当前的解决方案很糟糕,就是将日期时间发送到UDF中,以将其转换为同一天的午夜,然后检查这些日期是否相等。当涉及到查询计划时,这是一场灾难,联接或where子句中的几乎所有UDF都是如此。这是我的应用程序中唯一无法根除函数并为查询优化器提供一些可以实际用来定位最佳索引的地方之一。

在这种情况下,将功能代码合并回查询中似乎是不切实际的。

我想我在这里缺少一些简单的东西。

这是供参考的功能。

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, 0) = @activityDateMidnight [编辑]

我并入@Todd的建议:

where datediff(day, dateadd(hh, tz.Offset + case when ds.LocalTimeZone is not null then 1 else 0 end, t.TheDateINeedToCheck), @ActivityDate) = 0 我对datediff的工作方式(连续几年的同一天产生366,而不是我预期的0)的误解使我浪费了很多精力。

但是查询计划没有改变。我想我需要回到整个过程。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-15 17:36:07 463 0
1 条回答
写回答
取消 提交回答
  • 您几乎必须保持where子句的左侧干净。因此,通常,您会执行以下操作:

    WHERE MyDateTime >= @activityDateMidnight AND MyDateTime < (@activityDateMidnight + 1) (有些人更喜欢DATEADD(d,1,@activityDateMidnight)-但这是同一回事。)

    TimeZone表使事情变得有些复杂。从您的代码片段中还不清楚,但是看起来像t.TheDateInTable在GMT中带有时区标识符,然后您要添加偏移量以与@activityDateMidnight进行比较-这是本地时间。我不确定ds.LocalTimeZone是什么。

    如果是这样,那么您需要将@activityDateMidnight放入GMT。

    2019-11-15 17:36:20
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载