проверить, существует ли дата для конкретного месяца на сервере SQL - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над проектом, в котором мне нужно установить даты начала и окончания плана .

Планы должны быть настроены так, чтобы дата обновления плана былато же самое для всех месяцев (или после желаемых месяцев) .

Если план (ежемесячный) начинается 11 июня, срок его действия должен быть 10 июля, чтобы он мог продолжаться со следующих 11, а затем следующего11 и так далее.И если план является годовым для той же начальной даты, он должен истечь 10 июня, чтобы новая дата начала снова была 11 июня и т. Д.

Здесь мне нужно проверить, не существует ли даты истечения срока действия, напримересли планы начинаются с 31 января, то в этом сценарии у нас нет даты 30 февраля (даты истечения срока ее действия), для даты истечения срока следует указать 28 февраля, а если високосный год должен быть 29 февраля (последняя из недействительных датmonth).

Для того же я ищу функцию udf сервера sql, которая кроме 2-х параметров datetime и количества месяцев.Здесь он должен вернуть новую дату (дату истечения) после добавления месяцев (что является вторым параметром).

Попытка ниже, но не получая логику, как это сделать.

  --print dbo.[Bill_FnDateFormatPackageEndDate]('2018-06-11 12:25',1)    
CREATE function [dbo].[Bill_FnDateFormatPackageEndDate]    
(    
@datetime datetime,    
@months int    
)    
returns nvarchar(40)    
begin    
declare @date nvarchar(40)   
declare @testdate nvarchar(40)     
declare @day nvarchar(2)    
declare @month nvarchar(2)    
declare @year nvarchar(4)   
declare @time nvarchar(10)    

 if ISDATE(@datetime)=1
   begin
    set @day = day(@datetime)
    set @month = month(@datetime)+1
    set @year = year(@datetime)

    set @testdate =@year+'/'+@month+'/'+@day
    if ISDATE(@testdate)=1
    set @date=DATEADD(day, -1, @testdate ) 
   end
return @date    
end

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Этот запрос даст вам последнюю дату, основанную на начальной дате и количестве месяцев.Вы можете преобразовать это в 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
0 голосов
/ 11 июня 2018

Я решил, может быть, не лучшее решение, но оно работает так, как мне нужно.

--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
...