T-SQL Вернуться Даты следующих недель - PullRequest
0 голосов
/ 23 мая 2018

У меня есть таблица с информацией о каландре возвратов:

enter image description here

Я пытаюсь вернуться к следующей неделе с понедельника по пятницу независимо от того, в какой деньЭТА неделя

Например:

Сегодняшняя дата = 21.05.18 Возвращение 5/28/18 Через 6/1/18

Сегодняшняя дата = 22.05.17 Возвращение28.05.18 / 6/1/18

Сегодняшняя дата = 23.05.18 Возвращение 5/28/18 Через 6/1/18

Сегодняшняя дата = 5/24 /18 Возврат 5/28/18 Через 6/1/18

enter image description here

Это то, что у меня сейчас есть:

DECLARE @Date datetime
SET @Date = '5/23/18'

SELECT *, CASE WHEN date = @Date THEN (week + 1) END
FROM Calendar
WHERE  CASE WHEN date = @Date THEN (week + 1) END

Есть ли способ вернуть даты на следующую неделю?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если вам нужна небольшая математика, вы можете использовать функцию datepart () .Передача значения dw в качестве первого аргумента вернет вам день недели.

select datepart('dw','2018-05-21'); вернет '2' для понедельника, поскольку воскресенье считается первым днем ​​недели.

Используя это в качестве основы, я пришел к следующему.

Решение

declare @d date = GETDATE();
select  @d as 'Date',
    DATEADD(d, 9-DATEPART(dw,@d) + (1-(DATEPART(dw,@d)+5)/7)*-7, @d) as 'NextMonday',
    DATEADD(d,13-DATEPART(dw,@d) + (1-(DATEPART(dw,@d)+5)/7)*-7, @d) as 'NextFriday';

Объяснение

Поэтому идея состоит в том, чтобы рассчитать количество дней доследующий понедельник с текущего дня недели.Так Mon=2 -> +7 days, Tue=3 -> +6 days и т. Д. Количество добавляемых дней можно рассчитать по формуле:

  1. Взятие недели (7 дней, но понедельник = 2, поэтому 7 + 2 = 9)
  2. С учетом того, что день недели -DATEPART(dw,@d)

Если бы понедельник был первым днем ​​недели, это был бы он.Применение вышеуказанного в воскресенье добавит 8 дней вместо желаемого 1 дня.Это можно легко исправить, вычтя 7 дней, но это должно происходить только по воскресеньям.

Воскресенье - первый день недели, поэтому 1 Функция, которая возвращает '1' в воскресенье и '0' во все остальные дни (DATEPART(dw,@d)+5)/7 с помощью целочисленного деления Вычитая из этих значений, получим «1» по воскресеньям и «0» во все остальные дни Умножение на -7 превращает +0 days в -7 days только по воскресеньям

Соберите все это вместе, и у вас будет формула для получения в следующий понедельник.Следующая пятница всего на 5 дней дальше, поэтому 9 в начале формулы превращается в 13.

Чтобы увидеть это в действии (с промежуточными результатами): SQLFiddle

0 голосов
/ 23 мая 2018

Вы можете попробовать этот запрос.

Объясните

1900/01/01 - понедельник, так что вы можете сделать.

  • DATEADD(week, DATEDIFF(week, 0, dt) + 1, 0) позвольте date вычесть из 1900/01/01 , затем добавьте один к следующей неделе.
  • DATEADD(day,4,DATEADD(week, DATEDIFF(week, 0, dt) + 1, 0)) используйте функцию DATEADD, чтобы добавить 4день со следующего понедельника.

вот так.

SELECT DATEADD(week, DATEDIFF(week, 0, dt) + 1, 0) AS nextMon
, DATEADD(day,4,DATEADD(week, DATEDIFF(week, 0, dt) + 1, 0)) AS nextFri
FROM T

sqlfiddle: http://sqlfiddle.com/#!18/cec27/1

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