Мне было предложено создать хранимую процедуру, которая отображает количество единиц аренды в диапазоне переменных дат. У меня есть таблица со следующей схемой:Как я могу подсчитать, что общее количество факторов и даты и времени?
--Note that this is condensed, and in reality has proper constraints
--and more columns. Many dates from this table are tied to a single
--ContractDetail (separate table) by ContractDetailId.
CREATE TABLE RentalContractDates
(
RentalDateId INT IDENTITY(1,1) NOT NULL, --PK
ContractDetailId INT NOT NULL, --FK
RentalDate DATETIME NOT NULL,
Quantity DECIMAL(20,8) NULL
);
INSERT INTO RentalContractDates (ContractDetailId, RentalDate, Quantity)
VALUES (1, '04/01/2016 3:00 PM', 10),
(1, '04/10/2016 1:00 PM', 2),
(1, '04/15/2016 11:00 AM', -5),
(1, '04/15/2016 11:30 AM', -2),
(1, '04/27/2016 2:00 PM', -5);
пользователей будут вводить диапазон дат для поиска, и эта процедура должна найти все даты, которые находятся в пределах этого диапазона, а затем также фактор в то время отсечки, где клиент будет взиматься еще один день с их аренды.
Пример Сценарий: Общее время среза устанавливается до 12:00 PM. У меня есть 10 виджетах, снятых в 4/01/2016 в 15:00. Это в основном я подразумеваю, что я действительно арендовал их 4/02/2016, так как он прошел Cutoff Time 04/01. Я сдаю в аренду еще 2 на 4/10/2016 в 1:00 вечера, так что существенно 4/11/2016. Я возвращаю 5 виджетов 15.04.2016 в 11:00 и еще 2 в 11:30. Я хочу вернуть все виджеты на 4/27/2016, но я прохожу мимо Cutoff Time до 12:00 PM, поэтому вместо того, чтобы взимать плату за 4/02-4/27, на самом деле я буду взимать плату за 4/02 -4/28.
ВАЖНОЕ ЗАМЕЧАНИЕ: Если у меня были ранее арендованные количества до 04/01, что является началом диапазона отчетов, мне нужно будет включить их в отчет. Например, если бы у меня было 12 арендных ставок на 3/31, 4/1 и на добавление 12 к их итогам. Другими словами, любые предыдущие величины необходимо было вычислить в сумму, которая втягивается с введенными параметрами отчета @BeginDate и @EndDate. Итак, 04/01 будет читать 12, 04/02 будет читать 22 и т. Д.
Как вы можете видеть, мне не нужно, чтобы пользователи каждый день вводили свою аренду, я просто установил дату и время начала их аренду с количеством, и в следующий раз, когда они вступят в комбинацию даты/времени, он будет повторно суммирован.
Текущий код: Я хочу присоединиться к этому запросу со списком дат календаря на весь месяц и соответственно установить их количественные показатели.
DECLARE @BeginDate DATETIME = '04/01/2016',
@EndDate DATETIME = '04/28/2016';
DECLARE
@CutoffTime TIME = '12:00 PM';
SET @BeginDate = @BeginDate + @CutoffTime;
SET @EndDate = @EndDate + @CutoffTime;
SELECT gbd.ContractDetailId,
gbd.RentalDate,
gbd.Cutoff,
gbd.Quantity,
'Running Total' = SUM(Quantity) OVER (PARTITION BY ContractDetailId, RentalDate, Cutoff ORDER BY RentalDate)
FROM (
SELECT
r.ContractDetailId,
'RentalDate' = CONVERT(Date, RentalDate),
r2.Cutoff,
r.Quantity
FROM RentalContractDates r
INNER JOIN
(
SELECT
rcd.ContractDetailId,
'Cutoff' = CASE WHEN CONVERT(TIME, RentalDate) >= @CutoffTime THEN 'AFTER CUTOFF' ELSE 'BEFORE CUTOFF' END
FROM
RentalContractDates rcd
) r2
ON r2.ContractDetailId = r.ContractDetailId
WHERE
r.RentalDate Between @BeginDate and @EndDate
GROUP BY r.ContractDetailId, CONVERT(DATE, RentalDate), r2.Cutoff, Quantity
) gbd
ORDER BY RentalDate, Cutoff DESC
Я хочу присоединиться к данным с этим КТРОМ и установить количество для каждой даты:
;WITH T([Date]) AS
(
SELECT @StartDate
UNION ALL
SELECT DATEADD(DAY,1,T.[Date]) FROM T WHERE T.[Date] < @EndDate
)
SELECT * FROM T
Ожидаемых конечный вывод: После завершения отчета будет в конечном итоге выглядеть примерно так , хотя она будет повернута и включает в себя день недели в названии:
ContractDetailId RentalDate Quantity
----------------------------------------------------------------
1 04/01/2016 0 -- 0, because rentals were input after cutoff.
1 04/02/2016 10
1 04/03/2016 10 -- Continues until 4/10
1 04/10/2016 10
1 04/11/2016 12 -- Continues until 4/15
1 04/15/2016 5 -- I returned 5 and then 2, so this should sum since both were before the cutoff time.
-- Continues until 4/27.
1 04/27/2016 5 -- 5, because -5 was entered past cutoff on 4/27.
1 04/28/2016 0
у меня есть код поворота вдоль с динамическим sql, необходимым для окончательного вывода, уже завершенным (я могу опубликовать его, если это запрошено), но я теряюсь на том, как правильно группировать эти данные путем предварительной обрезки/пост-отсечения и соответственно изменить день. Как я должен справиться с этой ситуацией? Спасибо за любой совет/помощь!
Редактировать 1: Исправлены неверные данные образца.
Данные вашего образца показывают, что отображено 12 виджетах и 14 возвращено. Хотя это может быть прибыльной бизнес-моделью, кажется, это немного не так. – HABO
Чтобы отрегулировать время отсечки, просто вычтите '12 * 60 = 720' минут от каждого оригинала' datetime' и после этого проигнорируйте временную часть: 'CAST (DATEADD (минута, -720, RentalDate) AS date)'. –
@ ХАБО Вы правы, не знаете, как я это пропустил. 04/15 должно быть 5. Я его отредактировал. –