根据指定日期SQL 2008选择下一个日期

时间:2014-06-12 09:46:00

标签: sql sql-server-2008

我有一个包含日期字段的表,此日期字段称为[协议日期],并且是在达成协议以进行付款时创建的日期。我试图在下一笔付款到期时根据当月的日期计算出来。

例如,如果协议日期是2014年1月21日,那么下一笔付款将是2014年6月21日。这是我坚持的部分,如何让它忽略前几个月并简单地检查下一个截止日期?

2 个答案:

答案 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)完全忽略了xy的日期。如果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日)。