3

私はt-SqlでSQL Serverを使用しています。日付が週末に当たるかどうかを確認する次のコードがあり、そうであれば、その日が平日になるまで繰り返します

    Declare @ProDate as Date
    set @ProDate = '08/05/12'

    WHILE (DATEPART(DW, @ProDate) =  1 OR DATEPART(DW, @ProDate) =  7 )
    BEGIN

      set @ProDate =  DATEADD(day, 1, @ProDate)

    END

    select @ProDate

コードは機能しているようです。何か見逃していないか、これを処理するためのより良い方法があるかどうか疑問に思っています。

4

4 に答える 4

3

このコードは、システムの の設定に依存しDATEFIRSTます。

SET DATEFIRST 7日付チェックの前に追加します

または、これによりwhileループが回避されます

declare @df int = @@Datefirst       
set datefirst 1     
select 
    case when DATEPART(DW, @ProDate)>=6 then 
        DATEADD(d, 8-DATEPART(DW, @ProDate), @prodate)
    else @ProDate
    end    
set DATEFIRST @df
于 2012-08-02T14:48:33.990 に答える
0

以下を使用して、週末と休日を除外します

Declare @AddDay as integer = 3
Declare @NextWorkingDate  DateTime
Declare @StartDate  DateTime = Cast(getdate() as date)

While  @AddDay > 0 
    begin

        Select @NextWorkingDate =  @StartDate + @AddDay +
        (datediff(wk, @StartDate, @StartDate+ @AddDay  ) * 2) -- add weekend 

        --Exclude weekend
        If datepart(dw,@NextWorkingDate ) = 1 or datepart(dw,@NextWorkingDate ) = 7  --Add 2 days if target date is either Saturday or Sunday
            set @NextWorkingDate = @NextWorkingDate + 2 

        --Count no of holidays if falling within Hold days/Deposit days
        Select @AddDay = Count(*)  from HolidayTable ST --Holiday list
                    where ST.OffDate between @StartDate+1 and @NextWorkingDate
        Set @StartDate = @NextWorkingDate
    End         

Select @NextWorkingDate
于 2013-10-04T10:53:50.343 に答える
0

このコードは機能します。これは、頻繁に使用される関数で使用するコードとほぼ同じです。

唯一の提案は、休日チェックを統合する必要があるかどうかです。同様にスキップする必要がある日付を格納する Holiday テーブルがあります。

于 2012-08-02T14:46:57.333 に答える