Хранимая процедура ниже принимает вашу исходную дату ввода, дату начала диапазона и дату окончания диапазона.Годовая часть даты начала диапазона и дата окончания диапазона не имеют значения.Я обычно сохраняю их как 1900 при отправке их в качестве параметров.
Вместо того, чтобы принимать даты диапазона в качестве параметров, вы можете сделать выборку внутри sp, чтобы получить их из таблицы, в которой они хранятся.
Выходные данные разделяются точкой с запятой и могут быть изменены на любой другой разделитель путем изменения sp.(или принять это как параметр).Затем вы можете использовать свой код для анализа этого.
Построение временных дат является чисто арифметическим и не имеет преобразований varchar, следовательно, будет быстрее.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetDateRanges
@InputDate datetime
,@RangeBeginDate datetime
,@RangeEndDate datetime
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Year int, @DayOfMonthBeginDate tinyint, @MonthBeginDate tinyint, @DayOfMonthEndDate tinyint, @MonthEndDate tinyint
DECLARE @tempStartDate datetime, @tempEndDate datetime, @Result as varchar(8000)
-- Get the first range
SET @DayOfMonthBeginDate = DATEPART(dd, @RangeBeginDate)
SET @MonthBeginDate = DATEPART(mm, @RangeBeginDate)
SET @DayOfMonthEndDate = DATEPART(dd, @RangeEndDate)
SET @MonthEndDate = DATEPART(mm, @RangeEndDate)
SET @Year = YEAR(@InputDate)
SET @tempStartDate = DateAdd(day, @DayOfMonthBeginDate - 1, DateAdd(month, @MonthBeginDate - 1, DateAdd(Year, @Year-1900, 0)))
SET @tempEndDate = DateAdd(day, @DayOfMonthEndDate - 1, DateAdd(month, @MonthEndDate - 1, DateAdd(Year, @Year-1900, 0)))
-- Check if the inputdate is greater than the range dates for the first year
IF(@tempStartDate < @InputDate)
BEGIN
SET @tempStartDate = DateAdd(year, 1,@tempStartDate)
SET @tempEndDate = DateAdd(year, 1,@tempEndDate)
END
-- Loop through each year starting from the year of the input date until the current date
SET @Result = ''
WHILE(@tempStartDate < getdate())
BEGIN
SET @Result = @Result + Convert(varchar(10), @tempStartDate, 101) + ' - ' + Convert(varchar(10), @tempEndDate, 101) + '; ' + CHAR(13)
SET @tempStartDate = DateAdd(year, 1,@tempStartDate)
SET @tempEndDate = DateAdd(year, 1,@tempEndDate)
END
SELECT @Result
END
GO
Выполните sp какниже.Обратите внимание, что моя БД настроена на мм / дд / гггг.Вы можете использовать дд / мм / гггг в параметрах, и он все равно должен работать, поскольку sp не кодирует никакие даты.
EXECUTE [GetDateRanges] '7/18/1999','9/1/1900','10/31/1900'
Результат был:
09/01/1999 - 10/31/1999; 09/01/2000 - 10/31/2000; 09/01/2001 - 10/31/2001; 09/01/2002 - 10/31/2002; 09/01/2003 - 10/31/2003; 09/01/2004 - 10/31/2004; 09/01/2005 - 10/31/2005; 09/01/2006 - 10/31/2006; 09/01/2007 - 10/31/2007; 09/01/2008 - 10/31/2008; 09/01/2009 - 10/31/2009; 09/01/2010 - 10/31/2010;