输入:
Month, Year, GraceMonth. 都是整数。

我们需要做什么?

首先需要从月、年和日构造日期(需要从当前日期获取)
然后添加GraceMonth。添加GraceMonth后,我们显然会得到新的Date。
接下来,根据构造的日期,我们需要将其与当前日期进行比较。

你试过什么?

例如(我在零件中展示)

DECLARE @Month INT = 11
DECLARE @YEAR INT = 2012
DECLARE @Graceperiod INT = 2

SELECT
    [Construct Initial Date] = DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1) --construct initial date
    ,[Add Grace period] =DATEADD(mm,@Graceperiod,DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1)) --add grace month
    ,[DateDiff] = DATEDIFF
            (
                DAY,
                DATEADD(mm, (@YEAR - 1900) * 12 + (@Month + @Graceperiod) - 1 , DAY(GETDATE()) - 1),
                GETDATE()
             ) -- datediff

结果
Construct Initial Date        Add Grace period              DateDiff
2012-11-14 00:00:00.000       2013-01-14 00:00:00.000      -122

如果您的答案是正确的,那么您在寻找什么?

除了这个还有其他好的方法吗?没有 Casting 的越简洁越好。如果涉及一些棘手的部分(例如一些棘手的数学计算),请提供解释。

提前致谢。

最佳答案

试试这个:

DECLARE @Month INT = 11
DECLARE @YEAR INT = 2012
DECLARE @Graceperiod INT = 2

SELECT DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate())) as InitialDate,
       DATEADD(mm,@Graceperiod,DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate()))) as GraceDate,
       DATEDIFF(day,DATEADD(mm,@Graceperiod,DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate()))),GETDATE()) as DateDiffs

10-08 19:44