我有一个表,其中有一个日期字段,这个日期字段称为协议日期,是在达成支付协议时创建的日期。我正在设法计算下一次付款是在这个月的某一天到期的。
例如,如果协议日期是2014年1月21日-2014年,那么下一次付款将是21-6月-2014年。这是我被困的部分,我如何让它忽略前几个月,只是检查下一个到期日?
发布于 2014-06-12 10:56:07
SELECT
[agreement date],
CASE
WHEN [payment date this month] >= CAST(GETDATE() AS date)
THEN [payment date this month]
ELSE [payment date next month]
END AS [payment date]
FROM (
SELECT
[agreement date],
DATEADD(
MONTH,
DATEDIFF(MONTH, [agreement date], GETDATE()),
[agreement date]) AS [payment date this month],
DATEADD(
MONTH,
DATEDIFF(MONTH, [agreement date], GETDATE()) + 1,
[agreement date]) AS [payment date next month]
) AS subDATEDIFF(MONTH, x, y)完全忽略了x和y的月一天。如果x在一月份的某个位置,而y在二月的某个位置,那么DATEDIFF(MONTH, x, y)就是其中之一,即使差别仅仅是一天。
因此,您可以使用DATEDIFF(MONTH, [agreement date], GETDATE())获取要添加的月数,这将确保您获得本月的付款日期。再加上一个到下个月付款日期。
在此之后,简单地将[payment date this month]与GETDATE()进行比较,以确定它是否已经通过。
发布于 2014-06-12 10:39:31
也许有一种更优雅的方法可以做到这一点,但这应该适用于每月到期的付款:
SELECT [agreement date],
CASE WHEN DATEPART(DAY, [agreement date]) > 28 THEN
CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/28', 111)
ELSE
CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/' + CAST(DATEPART(DAY, [agreement date]) AS NVARCHAR(2)), 111)
END AS [Next payment due date]
FROM yourTable请注意,如果协议日期的日期已经过了,它将在该月28日生成付款到期日期,以说明任何可能出现的无效日期问题(如2月31日)。
https://stackoverflow.com/questions/24181274
复制相似问题