我有一个包含日期字段的表,此日期字段称为[协议日期],并且是在达成协议以进行付款时创建的日期。我试图在下一笔付款到期时根据当月的日期计算出来。
例如,如果协议日期是2014年1月21日,那么下一笔付款将是2014年6月21日。这是我坚持的部分,如何让它忽略前几个月并简单地检查下一个截止日期?
答案 0 :(得分:1)
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 sub
DATEDIFF(MONTH, x, y)
完全忽略了x
和y
的日期。如果x
位于1月的某个位置,并且y
位于2月的某个位置,那么DATEDIFF(MONTH, x, y)
就是1,即使差异只是一天。
因此,您可以使用DATEDIFF(MONTH, [agreement date], GETDATE())
获取要添加的月数,以确保您获得此月份的付款日期。并添加一个以获得下个月的付款日期。
在此之后,将[payment date this month]
与GETDATE()
进行比较以确定是否已通过该问题只是一件简单的事。
答案 1 :(得分:0)
可能有一种更优雅的方式,但这适用于每月到期的付款:
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日)。