Нужна хранимая процедура для возврата определенного диапазона дат - PullRequest
1 голос
/ 23 августа 2011

У меня есть диапазон с 1 сентября по 31 октября. Теперь мне нужна хранимая процедура, в которой я могу ввести определенную дату и хочу, чтобы процедура показывала все диапазоны до даты обновления.

для опыта: если я поставлю 18/7/1999, я должен получить:

1/9/1999 - 31/10/1999
1/9/2000 - 31/10/2000
1/9/2001 - 31/10/2001
.
.
.
1/9/2011 - 31/10/2011

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Хранимая процедура ниже принимает вашу исходную дату ввода, дату начала диапазона и дату окончания диапазона.Годовая часть даты начала диапазона и дата окончания диапазона не имеют значения.Я обычно сохраняю их как 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;  
0 голосов
/ 23 августа 2011

Ваш диапазон все в одном поле? (т.е. две даты в одном поле?)

В этом случае:

SELECT
   range
FROM
   table
WHERE CONVERT(datetime, right(range,10)) <= @date

Кстати: если вы храните свой диапазон дат в одном поле в виде строки типа «дд / мм / гггг - дд / мм / гггг», вы не сможете использовать индексированный поиск. (если вы не можете найти способ сравнить это поле с вашим параметром, не переупорядочивая / переформатируя его.).

Или, если у вас есть два поля (range_begin, range_end), то ...

SELECT
   cast(range_begin as varchar(10)) + ' - ' + cast(range_end as varchar(10))
FROM
   table
WHERE range_end <= @date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...