当前位置: 首页 > 面试题库 >

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

莫振
2023-03-14
问题内容

这是我遇到的问题:我有一个大型查询,需要比较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),这使我浪费了很多精力。

但是查询计划没有改变。我想我需要把整个事情都回到图纸上。


问题答案:

这更加简洁:

where 
  datediff(day, date1, date2) = 0


 类似资料:
  • 我有一个动态的日期列表,比如说他们相隔3个月,但是这些日期可能会变为相隔5个月、2个月等等 然后我有一个相隔一个月的日期列表。我需要做的是检查相隔1个月的列表中的哪个日期介于动态列表中的哪个月之间。 例如: 动态列表 2012年6月1日 静态列表 2012年6月1日 2012年7月1日 2012年8月1日 2012年9月1日 2012年10月1日 2012年12月1日 2013年1月1日 2013

  • 问题内容: 我有这段代码将字符串转换为日期对象 我想知道如果当前日期落在2天我的阵列中得到之间和 问题答案: 迅捷2 你已经在你的日期字符串转换的代码来。假设您在和中都有两个日期,那么您要做的就是检查当前日期是否在以下日期之间: 编辑: 如果要执行 包含 范围检查,请使用以下条件:

  • 我正在开发一个Java应用程序,它生成一个报告,报告的持续时间由用户在命令行中输入。用户需要以以下格式输入日期:dd-MM-yyyy <代码> 示例: java报告01-01-2013 31-03-2013 在代码中,我将日期保存为两个字符串。我必须确保用户输入的开始日期应早于结束日期。是否有一个内置函数可以通过将这两个字符串传递给它来帮助我实现这一点?

  • 问题内容: 即使是同一天,此条件也总是计算为,因为它正在比较时间。 如何检查日期是否与同一天? 问题答案: 如果您只想比较日期, 或者,显然 如果要检查它们是 同一 日期。 该文档通常很有帮助。通常,它也是的第一个Google搜索结果。除非您的问题与名为“ snake”的功能/模块有关。 基本上,模块具有三种存储时间点的类型: 年,月,日 时,分,秒,微秒,时区信息 结合日期和时间。它具有方法和获

  • 本文向大家介绍PHP判断两个给定日期是否在同一周的方法,包括了PHP判断两个给定日期是否在同一周的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP判断两个给定日期是否在同一周的方法。分享给大家供大家参考,具体如下: 运行结果: 不在同一周 PS:这里再为大家推荐几款时间及日期相关工具供大家参考使用: 在线日期/天数计算器: http://tools.jb51.net/jisuan

  • 问题内容: 我正在使用Java应用程序,该应用程序会在用户在命令行中输入的持续时间内生成报告。用户需要以以下格式输入日期:dd-MM-yyyy 例: java报告2013年1月1日至2013年3月31日 在代码中,我将日期保存在两个字符串中。我必须确保用户输入的开始日期应该早于结束日期。是否有内置函数可以通过将这两个字符串传递给它来帮助我实现这一目标? 问题答案: 您可以使用Date.before