查找之间的月份而不考虑实际的天数

时间:2018-10-02 02:18:04

标签: sql sql-server sql-server-2012

我在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 

我需要为每一行列出“月差异”。该服务于2017年1月30日完成。于2017年1月31日收到第一笔付款。对于该行,月份差为0。

第二笔付款已于2017年2月1日收到。对于此行,月份差为1。

以下查询工作正常,直到将年份从2017年更改为2018年为止。当付款于2018年1月10日收到时,显示月份差异为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 :(得分:1)

我认为以下查询将解决您的问题(我保留了原始代码,但添加了新列,以便您可以比较差异)

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