Я использую формулу Стива Касса, чтобы получить n-й день недели в n-й неделе предыдущего месяца на определенную дату. Он отлично работает - но я действительно не понимаю, что делает операнд модуля в формуле. Может кто-нибудь объяснить? Я пытался поставить некоторые данности ниже:Объяснение модуля для формулы Стива Касса для определения 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
Вы пренебрегли ответом на фактический вопрос: что он делает ** в формуле **. Нужно ли вообще? –
@PM: «что [оператор модуля] ** в формуле **» - это то же самое, что оператор модуля всюду ...он возвращает оставшуюся часть операции целочисленного деления. Вопрос, на который я забыл ответить, был вопросом, который не задавался ... ** «Зачем нужна модульная операция в формуле» **. Я подозреваю, что это в формуле, потому что вычитание '@ dow' и' weekday' потенциально отрицательно. Добавив 7, а затем выполнив операцию модуля для устранения полных недель, формула возвращает число дней в диапазоне от 0 до 6. – spencer7593
Большое спасибо, Spencer7593. Это имеет смысл для меня о сокращении, и я искренне ценю ваш очень подробный ответ. Смогла получить маленькие серые клетки вокруг концепции. – user1795131