我在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
结果
答案 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
结果如下