2012-02-24 3 views
2

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

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

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

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

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

+0

На какую базу данных это нацелено? – TPete

+0

Это для SQL Server 2008 – abhishekSikka

+0

@Ben Создание тегов, подобных этому, является грубым и неуместным. Если вы чувствуете, что вопрос не показывает достаточных усилий со стороны искателя, пожалуйста, поставите вопрос. –

ответ

1
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, если дата уже просрочена.

+1

Это смешение PL/SQL и T-SQL и содержит несколько ошибок, не связанных с смешиванием синтаксиса. – TPete

+0

да .. это мой первый раз, когда я пишу функцию pl/sql .. но идея есть ... подумайте об этом как псевдокод – Isaac

+0

Это замечательно. Я знаю, как действовать дальше. – abhishekSikka

1

Это может вас заинтересовать. Взятые Из: How-to-get-the-Nth-weekday-of-a-month

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 

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

+0

Получил. Большое спасибо. – abhishekSikka