Функция SQL, которая с учетом даты вычисляет следующую дату на основе параметра дня недели

Я хотел бы знать, есть ли у кого-то функция в SQL, чем заданная начальная дата и день недели (например, вторник), она может рассчитать, когда наступит следующая дата, начиная с начальной даты, которая будет вторником.

Например:

Дано:

@initialdate=01-02-2013 --Сегодня пятница

@dayofweek = 3 --3 для среды, 1 для понедельника и 7 для воскресенья.

Возврат: дата = 06-02-2013

Может быть, я еще не очень хорошо объяснил. Я имею в виду функцию, для которой параметр @dayofweek=3 (для среды), и тогда я могу указать много разных дат:

01-02-2013, то если @dayofweek=3, то следующая дата будет 06-02-2013.

02-02-2013, то если @dayofweek=3, то следующая дата будет 06-02-2013.

03-02-2013, то если @dayofweek=3, то следующая дата будет 06-02-2013.

02-04-2013, то если @dayofweek=3, то следующая дата будет 02-06-2013.

05-02-2013, то если @dayofweek=3, то следующая дата будет 06-02-2013.

02-06-2013, то если @dayofweek=3, то следующая дата будет 13-02-2013.

07-02-2013, то если @dayofweek=3, то следующая дата будет 13-02-2013.


person Artemination    schedule 15.05.2013    source источник
comment
Можете ли вы привести еще несколько примеров? Почему у вас не работает DateAdd(Day, 1, myDate)?   -  person Dan Pichelman    schedule 15.05.2013
comment
Между Dateadd и datename(dw,myDate) вернуть название дня недели — это действительно не так уж и сложно.   -  person Michael Gardner    schedule 15.05.2013
comment
@MichaelGardner, я обновил вопрос ..   -  person Artemination    schedule 15.05.2013
comment
@DanPichelman я обновил вопрос ..   -  person Artemination    schedule 15.05.2013
comment
Ой. Вы хотите знать, когда указана дата/день недели, когда наступит следующая соответствующая дата/день недели?   -  person Michael Gardner    schedule 15.05.2013
comment
да, следующее вхождение в будний день, что-то вроде этого в финале sqlmag. com/t-sql/дата-время-вычисления-часть-3   -  person Artemination    schedule 15.05.2013
comment
Привет! Если вы все еще заинтересованы, вы можете проверить это: stackoverflow.com/a/38601630/5089204. Этот ответ обеспечивает независимый от культуры подход.   -  person Shnugo    schedule 28.07.2016


Ответы (1)


Это некрасиво, но мои попытки создать более элегантное решение не увенчались успехом.

Обратите внимание, что предполагается, что DATEPART(dw, @someVarThatIsSunday) возвращает 1. См. Set DateFirst для получения дополнительной информации.

declare @dayofweek int
set @dayofweek = 3
declare @initialDate datetime
set @initialDate = getdate()

declare @increment int

select @increment =
case DATEPART(dw, @initialDate)
    when 1 then @dayofweek
    when 2 then @dayofweek + 6
    when 3 then @dayofweek + 5
    when 4 then @dayofweek + 4
    when 5 then @dayofweek + 3
    when 6 then @dayofweek + 2
    when 7 then @dayofweek + 1
end

if @increment > 7
begin
    set @increment = @increment - 7
end

select DATEADD(day, @increment, @initialDate)
person Dan Pichelman    schedule 15.05.2013
comment
Привет, для независимого от культуры подхода вы можете проверить это: stackoverflow.com/a/38601630/5089204. - person Shnugo; 28.07.2016