检查sql server中特定月份的日期是否存在

时间:2018-06-11 10:36:39

标签: sql-server sql-server-2012

我正在开展一个项目,我需要设置计划的开始和结束日期

计划将在订单中设置,以便计划的续订日期在所有月份(或在所需的月份之后)相同

如果计划(月度)从6月11日开始,其到期日应为7月10日,以便可以从下一个11继续,然后是下一个11,依此类推。如果计划是同一个开始日期的年度,它应该在6月10日到期,以便新的开始日期将是6月11日,依此类推。

在这里,我需要检查是否存在失效日期,如果计划从1月31日开始,那么在这种情况下我们没有日期30日(其失效日期),到期日应设置为28 feb,如果闰年应该是29日(无效日期的最后一个月)。

对于同样的我正在寻找一个sql server udf函数,除了2个参数的日期时间和月数。在这里它应该在添加月份之后返回一个新的日期(到期日期)(这是第二个参数)。

尝试下面但没有得到逻辑如何继续它。

axarr[0].plot(x,y,'r', label="y={0:.2f}x+{1:.2f}\nr{2:.2f}".format(slope_b,intercept_b,r_value_b), color='black')
axarr[0].legend()

2 个答案:

答案 0 :(得分:1)

此查询将根据startdate和月数提供最后日期。您可以将其转换为UDF。

select case when day(DATEADD(month, @nMonths, @StartDate)) = day(@StartDate) then dateadd(day, -1, DATEADD(month, @nMonths, @StartDate)) else DATEADD(month, @nMonths, @StartDate) end

答案 1 :(得分:0)

我已经解决了它,可能不是最好的解决方案,但它可以按照我的需要工作。

--print dbo.[Bill_FnDateFormatPackageEndDate]('2018-06-09 0:00',1)    
Alter function [dbo].[Bill_FnDateFormatPackageEndDate]    
(    
@startdate datetime,    
@months int    
)    
returns nvarchar(40)    
begin    
declare @date nvarchar(40)   
declare @testdate datetime     
declare @day int   
declare @month int
declare @year int
declare @NoOfDays int

   if ISDATE(@startdate)=1
   begin
    set @day = day(@startdate)
    set @month = month(@startdate)+@months
    set @year = year(@startdate)
    if @month>12
    begin
        set @month=@month-12
        set @year=@year+1
    end
    set @testdate=cast( (cast(@year as nvarchar(4))+'-'+cast(@month as nvarchar(2))+'-'+cast(1 as nvarchar(2))+' 0:00') as datetime)
    set @NoOfDays= datediff(day, dateadd(day, 1-day(@testdate), @testdate), dateadd(month, 1, dateadd(day, 1-day(@testdate), @testdate)))

    if @NoOfDays>=@day
    begin
        set @testdate =cast( cast((cast(@year as nvarchar(4))+'-'+cast(@month as nvarchar(2))+'-'+cast(@day as nvarchar(2))+' 0:00') as nvarchar(40)) as datetime)
        set @date=DATEADD(day, -1, cast(@testdate as datetime)) 
    end
    else     
         set @date =cast( cast((cast(@year as nvarchar(4))+'-'+cast(@month as nvarchar(2))+'-'+cast(@NoOfDays as nvarchar(2))+' 0:00') as nvarchar(40)) as datetime)            
   end
return @date--@date    
end