查找第 N 周的第 N 天






1.80/5 (2投票s)
这个 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:第一个版本。