Нахождение промежуточных месяцев без учета фактического количества дней - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующая таблица в SQL Server 2012 для хранения платежей, полученных за услугу.Это не нормализованная таблица, но я не могу ее изменить.

CREATE TABLE #ServicePaymentCollection (ServiceID INT, ServiceDate DATE, ServiceAmount INT, 
                                        PaymentDate DATE, AmountPaid INT)
INSERT INTO #ServicePaymentCollection
SELECT 2, '2017-01-30', 1200, '2017-01-31', 50 UNION
SELECT 2, '2017-01-30', 1200, '2017-02-01', 200 UNION
SELECT 2, '2017-01-30', 1200, '2017-05-20', 200 UNION
SELECT 2, '2017-01-30', 1200, '2017-11-20', 200 UNION
SELECT 2, '2017-01-30', 1200, '2017-12-20', 200 UNION
SELECT 2, '2017-01-30', 1200, '2018-01-10', 200 UNION
SELECT 2, '2017-01-30', 1200, '2018-02-15', 150 

Мне нужно перечислить «Разницу в месяц» для каждой строки.Услуга была оказана 30 января 2017 года.Первый платеж был получен 31 января 2017 года.Для этой строки разница в месяце равна 0.

Второй платеж получен в феврале / 01/2017.Для этой строки разница в месяце равна 1.

Следующий запрос работает нормально до тех пор, пока год не будет изменен на 2018 год с 2017 года. Когда платеж получен 10 января 2018 года, он показывает разницу в месяце 100. Какчтобы исправить это.

Примечание. Это упрощенный сценарий для моего реального проекта.

SELECT *, (PaymentYearMonth - ServiceYearMonth) AS MonthDifference
FROM
(
    SELECT *,
            CONVERT(INT,(CONVERT(VARCHAR(20),YEAR(ServiceDate)) + RIGHT('00'+CONVERT(VARCHAR(20), MONTH(ServiceDate)),2)  )) ServiceYearMonth,
            CONVERT(INT,(CONVERT(VARCHAR(20),YEAR(PaymentDate)) + RIGHT('00'+CONVERT(VARCHAR(20), MONTH(PaymentDate)),2)  )) PaymentYearMonth 
    FROM #ServicePaymentCollection
)T
ORDER BY MonthDifference

Результат

enter image description here

1 Ответ

0 голосов
/ 02 октября 2018

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

SELECT *, (PaymentYearMonth - ServiceYearMonth) AS MonthDifference, newMonthDiff = datediff(month, ServiceDate, PaymentDate)
FROM
(
    SELECT *,
            CONVERT(INT,(CONVERT(VARCHAR(20),YEAR(ServiceDate)) + RIGHT('00'+CONVERT(VARCHAR(20), MONTH(ServiceDate)),2)  )) ServiceYearMonth,
            CONVERT(INT,(CONVERT(VARCHAR(20),YEAR(PaymentDate)) + RIGHT('00'+CONVERT(VARCHAR(20), MONTH(PaymentDate)),2)  )) PaymentYearMonth 
            --, ServiceDate, PaymentDate
    FROM #ServicePaymentCollection
)T
ORDER BY MonthDifference

Результат выглядит следующим образом

enter image description here

...