Подсчет количества недель между днями в SQL Server 2005 - PullRequest
2 голосов
/ 24 мая 2011

Я снова здесь, чтобы помочь. Это то, что я пытаюсь сделать. У меня есть функция или SP, который принимает 3 параметра. startdate, enddate, и dayofweek (m, t, w и т. Д.) Необходимо подсчитать, сколько недель проходит между начальной и конечной датой.

Например, если я передам startday=2011-05-02, enddate=2011-05-10 и dayofweek как вторник, он должен засчитать 2, если я передам dayofweek как среду, то он должен подсчитать 1.

Я могу работать с этим кодом, есть ли лучший способ сделать это? ClosingStartDate корректируется на правильную дату начала на основе используемого dayofweek. Таким образом, в основном код добавляет 1 неделю к runningdate, и текущая дата корректируется в зависимости от используемой недели.

Любой другой способ сделать это без while.loop. ???

declare @NoofPeriods int
declare @runningdate datetime

 set @runningdate = @ClosingStartDate
 set @NoofPeriods=0
 while (@runningdate <= @NextStatementClosingdate)
  begin
    set @NoofPeriods=@NoofPeriods+1
    set @runningdate = Dateadd(day,7,@runningdate)
  end

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

Он уже встроен в SQL 2005.

SELECT DATEDIFF(week, @startdate, @enddate)
2 голосов
/ 25 мая 2011

Я, вероятно, не умер с синтаксисом SQL Server, но такая логика должна работать.В основном используйте арифметику по модулю-7, чтобы определить, сколько «нечетных» дней у вас есть в начале периода и включают ли они один из выбранных вами дней недели (как определено вашим dayofweek) или нет.

@diffInDays = SELECT DATEDIFF(day, @startdate, @enddate)

@startDateDay = SELECT DATEPART(weekday, @startdate)

set @diffInWholeWeeks = @diffInDays / 7
set @diffRemainderDays = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek - @startDateDay ) % 7 )
  begin
    set @extraWeek = 1
  end
else
  begin
    set @extraWeek = 0
  end

set @answer = @diffInWholeWeeks + @extraWeek
1 голос
/ 25 мая 2011

@ ответ Слотропа почти мертв, поэтому я собираюсь основать его на этом коде и объявить ответ тем более.

Хорошо, этот комментарий был неправильным (пожалуйста, игнорируйте):


Поскольку дни с 1-7 вместо 0-6, мы должны учитывать это.Я делаю это, вычитая одну после нашей второй модульной.Я не проверял все сценарии, но, похоже, он работает.


То, что меня расстроило, это смена недели.Добавьте 7 в день недели, чтобы убедиться, что мод работает.

Это должно работать,

--Setup
DECLARE @dayofweek int = 4
DECLARE @startdate datetime = '5/2/2011'
DECLARE @enddate datetime = '5/10/2011'

--Solution
DECLARE @diffInDays int = DATEDIFF(day, @startdate, @enddate);
DECLARE @startDateDay int = DATEPART(weekday, @startdate);
DECLARE @extraWeek int = 0;

DECLARE @diffInWholeWeeks int = @diffInDays / 7
DECLARE @diffRemainderDays int = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek + 7 - @startDateDay ) % 7 )
    set @extraWeek = 1

DECLARE @answer int = @diffInWholeWeeks + @extraWeek

SELECT @answer 

Примечание: я не уверен, что встроенная настройка объявлений поддерживается в 2005 году. Если такпросто используйте оператор SET или SELECT для установки значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...