Алгоритм вычисления относительной даты в SQL - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть требование для расчета следующего месячного времени выполнения задания, которое можно указать с помощью двух параметров, которые могут принимать значения от

Параметр 1:
1 для воскресенья, 2 для понедельника, 3для вторника, 4 для среды, 5 для четверга, 6 для пятницы, 7 для субботы, 8 для дня, 9 для дня недели, 10 для дня выходных

Параметр 2:
1 для первого, 2 для второго, 4 для третьего, 8 для четвертого, 16 для последнего

На основе этих двух параметров вы можете указать время выполнения, например, первый день недели месяца или последнее воскресенье месяца.

Как сделатьЯ прихожу к этой дате, используя хранимую процедуру, которая будет знать текущую дату, para1 и para2

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Это может помочь вам начать. Взято из: Как получить N-й день недели в месяце

CREATE FUNCTION dbo.fnGetNthWeekdayOfMonth
(
 @theDate DATETIME,
 @theWeekday TINYINT,
 @theNth SMALLINT
)
RETURNS DATETIME
BEGIN
  RETURN  (
            SELECT  theDate
            FROM    (
                        SELECT  DATEADD(DAY, 7 * @theNth - 7 * SIGN(SIGN(@theNth) + 1) +(@theWeekday + 6 - DATEDIFF(DAY, '17530101', DATEADD(MONTH, DATEDIFF(MONTH, @theNth, @theDate), '19000101')) % 7) % 7, DATEADD(MONTH, DATEDIFF(MONTH, @theNth, @theDate), '19000101')) AS theDate
                        WHERE   @theWeekday BETWEEN 1 AND 7
                                AND @theNth IN (-5, -4, -3, -2, -1, 1, 2, 3, 4, 5)
                    ) AS d
            WHERE   DATEDIFF(MONTH, theDate, @theDate) = 0
        )
END

Это не совсем то, что вы ищете, но должно охватывать основную часть.

1 голос
/ 24 февраля 2012
create function schema.get_next_run_date(@day int, @week int)
returns datetime
as
begin
declare @rtResult datetime
declare @frstDayOfMonth datetime
set @frstDayOfMonth = SELECT TRUNC(current_date, 'MM') FROM dual
if @day <= 7
    set @rtResult = SELECT NEXT_DAY(@frstDayOfMonth + ((parm2-1)*7) day, param1) "NEXT DAY" FROM DUAL
else if @day = 8
    set @rtResult = SELECT NEXT_DAY(@frstDayOfMonth + pamr2) "NEXT DAY" FROM DUAL
else if @day = 9
    declare intDay int
    set @intDay = datepart(weekday, @frstDayOfMonth)
    if (@intDay between 2 and 6)
        set @rtResult = @frstDayOfMonth
    else if (@intDay = 1)
        set @rtResult = @frstDayOfMonth + 1 day
    else
        set @rtResult = @frstDayOfMonth + 2 day
else if @day = 10
    declare intDay int
    set @intDay = datepart(weekday, @frstDayOfMonth)
    if (@intDay between 2 and 6)
        set @rtResult = @frstDayOfMonth + 7 - @intDay
    else
        set @rtResult = @frstDayOfMonth
else
    set @rtResult = null
return @rtResult
end
go

не проверено.но я надеюсь, что это поможет.И вы можете вернуть значение null, если дата уже просрочена.

...