繁体   English   中英

史蒂夫·卡斯(Steve Kass)公式的模数解释,该公式在一个月的第n个星期中找到第n个星期

[英]Modulus explanation for Steve Kass formula of finding nth day of week in nth week of month

我正在使用史蒂夫·卡斯(Steve Kass)公式来获取给定日期的上个月的第n周中的第n天。 它的效果很好-但是我真的不明白模数操作数在公式中的作用。 有人可以解释吗? 我尝试在下面提供一些信息:

    declare @svcDate as datetime= '1/6/2017', @myN as tinyint=4, @myD as tinyint=1

declare @ret datetime;  
declare @first datetime -- First of the month of interest (no time part)
declare @nth tinyint -- Which of them - 1st, 2nd, etc.
declare @dow tinyint -- Day of week we want - this server is set to - 1 sun, 2 mon, 3 tue, 4 wed, 5 thur, 6 fri, 7 sat
set @first = dateadd(month,-1,datefromparts(year(@svcDate), month(@svcDate), 1)) --first of last month
set @nth = @myN
set @dow = @myD
--Select @first 12/1/2016

set @ret = @first + 7*(@nth-1)
--select @ret 12/22/2016  Thurs
--datepart(weekday,@ret)=5

set @ret=  @ret + (7 + @dow - datepart(weekday,@ret))%7

if(@ret IS NULL)   
    set @ret='1/1/2017';  

select @ret

select 3%7  --returns 3

select convert(decimal(18,2),3)/convert(decimal(18,2),7)  -- returns 0.42857142857142857142

模运算符( % )执行整数除法,然后返回余数。

如果您还记得小学数学。

23 divided by 7

7次进入23次三下,其余2次

23 = ( 7 * 3 ) + 2

模函数仅返回整数除法后的余数。


是的,我们希望表达式3%7返回3

表达式10%7也将返回3


编辑

问:为什么在公式中使用模数运算符?

答:这是一条捷径,它消除了很多不使用条件检查的情况。 (可以不进行模运算而执行公式,但是公式要短得多。)

在公式中,从@dow减去weekday可能是负数天。

在公式中,我们不希望出现负数的天数。 我们想前进几天,而不是倒退。

快捷方式是将减法结果增加7天。 这保证了我们不会出现负数的天。 但这加法带来了另一个问题...如果减法导致天数为正,那么我们现在将有整整一周的时间加上该天数。 模除法消除了整周的时间,使我们@first 0到6之间的整数,即我们要添加到@first的天数。


不使用模数,我们可以获得相同的结果。 为此,我们将从@dow减去weekday 如果减法的结果为 ,则加7。

模数只是一个捷径。 该公式在所有情况下加7,然后在结果大于6的情况下减去7。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM