65.9K
CodeProject 正在变化。 阅读更多。
Home

查找第 N 周的第 N 天

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.80/5 (2投票s)

2007 年 6 月 28 日

CPOL

2分钟阅读

viewsIcon

29759

downloadIcon

138

这个 SQL Server 函数可以帮助获取第 n 周的第 n 天。

引言

这是一个在 SQL Server 2000 中创建的通用函数。它接受三个参数,并以 DateTime 格式返回第 n 周的第 n 天。

使用代码

这段代码对那些希望获取给定月份第 n 周的第 n 天日期的人很有用。

为了获得所需输出,最终用户/DBA 需要以数字形式传递周数。第二个参数是星期几。有效值介于 1 到 7 之间,其中 1 代表星期日,2 代表星期一,依此类推。第三个参数是该月中的任何日期,用于获取所需数据。

例如:如果用户需要搜索 2007 年 7 月的第二个星期五,那么所需的 Exec 语句将是

select dbo.getWeekDay(2,6,'2007-07-10')

上面的代码将返回 2007-07-13 00:00:00.000

CREATE function getWeekDay( @var_weeknum int, @var_weekday int, @var_date datetime)
returns datetime
as
BEGIN
 declare @cnt int
 declare @startDay int
 declare @DayDiffrence int 
 declare @ReturnDate datetime
 set @cnt = 1
 set @startday =  datepart(dw, dateadd(mm, datediff(mm, 0, @var_Date),0))
 set @DayDiffrence = @var_weekday - @startday
 set @ReturnDate = dateadd(mm, datediff(mm, 0, @var_date),0)
 
 if(@DayDiffrence > 0)
 begin
  set @ReturnDate = dateadd(d,@DayDiffrence,@ReturnDate)
  set @ReturnDate = dateadd(wk,@var_weeknum - 1,@ReturnDate)
 end
 else
 begin
  set @ReturnDate = dateadd(d,7 - (@DayDiffrence * -1),@ReturnDate)
  set @ReturnDate = dateadd(wk,@var_weeknum - 1,@ReturnDate)
 end
 
 return @ReturnDate
end

在上面的代码中,@Startday 最初将包含给定月份的起始日。对于上面的示例,它将返回 01(星期日)@DayDiffrence 将携带 @startday 和作为参数传递的 @var_weekday 之间的差异。 在我们的示例中,@DayDiffrence 将具有 01 - 06 = -05 的值。 @ReturnDate 将初始化为该月的起始日期。这意味着该变量最初将携带给定月份的 第一天。 按照上面的示例,@ReturnDate 将具有 '2007-07-01 00:00:00'

如果起始日 早于 所需的日期,则 @DayDiffrence 将具有 正值。在这种情况下,只需要将差异添加到起始日期,并从中减去 1 即可获得所需的日期。 对于第 n 周,我们需要将 @var_weeknum - 1 添加到它。

如果起始日 晚于 所需的日期,则 @DayDiffrence 将具有 负值。在这种情况下,只需要将 @DayDiffrence 的模添加到起始日期,并且第 n 周的逻辑与正值的情况相同。

历史

  • 2007-06-28 10:30:00 CST:第一个版本。
© . All rights reserved.