T-SQL, как получить диапазон дат за 2 недели оплаты - PullRequest
3 голосов
/ 31 декабря 2011

У меня есть следующие исходные данные:

  1. Начало периода оплаты: 3 декабря
  2. Конец Payperiod: 16 декабря

Это всего лишь пример того, как заработает компания.

Теперь у меня есть только 1 ввод даты, например 12/30 (как сегодня) Мне нужно вывести диапазон дат для текущего периода оплаты, который будет: 17 декабря - 30 декабря

И то же самое, если я введу 3 января - я должен вернуться с 31 декабря по 13 января 2012

Есть ли какие-либо ярлыки в T-SQL или я должен делать циклы?

РЕДАКТИРОВАТЬ: резюмировать вопрос. если мы знаем, когда начинается платежный цикл (в прошлом) - как определить начальный период оплаты для данной даты?

Ответы [ 2 ]

5 голосов
/ 31 декабря 2011

Вам нужны некоторые операции по модулю и DATEDIFF.

declare @periodStart datetime
declare @periodEnd datetime

set @periodStart = CAST('2011-12-03' as datetime)
set @periodEnd = CAST('2011-12-16' as datetime)

declare @anyDate datetime
set @anyDate = CAST('2011-12-30' as datetime)

declare @periodLength int
set @periodLength = DATEDIFF(day, @periodStart, @periodEnd) + 1


declare @daysFromFirstPeriod int
set @daysFromFirstPeriod = DATEDIFF(day, @periodStart, @anyDate)
declare @daysIntoPeriod int
set @daysIntoPeriod = @daysFromFirstPeriod % @periodLength

select @periodLength as periodLength, @daysFromFirstPeriod as daysFromFirstPeriod, @daysIntoPeriod as daysIntoPeriod
select DATEADD(day, -@daysIntoPeriod, @anyDate) as currentPeriodStart, DATEADD(day, @periodLength -@daysIntoPeriod, @anyDate) as currentPeriodEnd

Дает вывод

periodLength    daysFromFirstPeriod daysIntoPeriod
14              27                  13

и

currentPeriodStart        currentPeriodEnd
2011-12-17 00:00:00.000   2011-12-31 00:00:00.000
0 голосов
/ 22 июня 2016

Не сработает ли следующее?

DECLARE @StartDate DATETIME
SELECT @StartDate = '2016-05-01 00:00:00.000'
DECLARE @EndDate DATETIME
SELECT @EndDate = '2017-04-01 00:00:00.000'

DECLARE @Dates TABLE(StartDate DATETIME, EndDate DATETIME)

WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO @Dates (StartDate, EndDate)
SELECT @StartDate - 13, @StartDate WHERE DATEPART(WEEK, @StartDate) % 2 = 1 AND DATEPART(WEEKDAY, @StartDate) = 7

SET @StartDate = @StartDate + 1 
END

-- Check the dates here... should be every 2 weeks
SELECT * FROM @Dates
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...