我正在开展一个项目,我需要设置计划的开始和结束日期。
计划将在订单中设置,以便计划的续订日期在所有月份(或在所需的月份之后)相同。
如果计划(月度)从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()
答案 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