Startdate、Enddate、およびWorkday(nth)を渡すと、週末と休日を除いたn番目の稼働日を計算するSQL関数が既に用意されています...Oracleのn番目の稼働日を取得する
ワーキングSQL関数:私は(oracleに新)ORACLEでこの機能を再作成しようとしています
FUNCTION [dbo].[getNthWorkingDate]
(
@StartDate as datetime,
@EndDate as datetime,
@WorkDay as int
)
RETURNS datetime
AS
BEGIN
-- Declare the return variable here
DECLARE @WorkDate as datetime, @LeaveYear as smallint,@iCount as int
set @LeaveYear = datepart(year, @StartDate)
set @iCount = 1
WHILE (@StartDate < @EndDate)
BEGIN
IF (DATENAME(WEEKDAY,@StartDate) = 'SUNDAY') OR (DATENAME(WEEKDAY,@StartDate) = 'SATURDAY')
-- Just to keep the if statement with out code
set @iCount = @iCount;
ELSE IF EXISTS (SELECT * FROM HOLIDAYS WHERE CAST (HOLIDAY + ' ' + CAST(@LeaveYear AS VARCHAR) AS DATETIME) = @StartDate)
-- Just to keep the if statement with out code
set @iCount = @iCount;
ELSE
begin
set @WorkDate = @StartDate
if @iCount = @WorkDay
BREAK;
else
set @iCount = @iCount + 1;
end
set @StartDate = dateadd(day, 1, @StartDate);
END
-- Return the result of the function
RETURN @WorkDate
END
が、私はいくつかの変更を行いましたが、それは働いて得ることができなかった、私は中に何かが足りないと思いますルーピング、任意のヘルプは高く評価されるだろう...事前にお礼..
オラクル機能:
create or replace FUNCTION GETNTHWORKINGDATE (pStartDate DATE,
pEndDate DATE,
pWorkDay NUMBER)
RETURN DATE
AS
vStartDate DATE;
vWorkDate DATE ;
vCount NUMBER;
vHoliday DATE;
BEGIN
vCount := 1;
BEGIN
SELECT HOLIDAY_DATE INTO vHoliday FROM HOLIDAY WHERE (to_char(HOLIDAY_DATE, 'MM DD') = to_char(pStartDate, 'MM DD'));
EXCEPTION
WHEN NO_DATA_FOUND THEN
vHoliday := NULL;
END;
vStartDate := pStartDate;
BEGIN
WHILE (vStartDate < pEndDate)
LOOP
IF (to_char(vStartDate, 'DAY') = 'SUNDAY') OR (to_char(vStartDate, 'DAY') = 'SATURDAY') THEN
vCount := vCount;
ELSIF (to_char(vHoliday, 'MM DD') = to_char(vStartDate, 'MM DD')) THEN
vCount := vCount;
ELSE
vWorkDate := vStartDate;
IF vCount = pWorkDay THEN
EXIT;
ELSE
vCount := vCount + 1;
END IF;
END IF;
vStartDate := vStartDate + 1;
END LOOP;
END;
RETURN vWorkDate;
END GETNTHWORKINGDATE;
かなり曖昧である "作業それを得ることができませんでした"。間違いはありますか?何のエラー?あなたは間違った結果を得ますか?あなたはどのようなパラメーターを渡していますか、どのような結果が欲しいのですか?どのような結果が得られますか? –
私は間違った結果を得ています。シナリオ1:私はstartdate:07/20/2016、end date:07/30/2016、そしてworking dayを1とします。第1作業日07/20/2016、この結果が得られました。それは正しいです。シナリオ2:同じ入力については、休日として07/20/2016を設定します。作業日として07/21/2016を取得しています。そうです。週末は除外されていません。出発日に07/16を渡すと、土曜日の結果として07/16が与えられます。最初の作業日は07/18になるはずです。 – user6621250
また、開始日が休日でない休日を計算していない場合、scenario3:07/20は休日です。私は07/19を開始日と2日として渡すので、結果として07/21を取得する必要があります。それは休日のテーブルの休日として設定されて私に07/20を与えています。 – user6621250