none
指定日より第何週かを求める RRS feed

  • 質問

  • お世話になります

    SQLSERVERで指定日より5週目かを判定する関数を作りたいと考えております

    条件としては

    客先ごとに締め日単位で行い、10日締、20日締、月末締があります

    対象月が2014年11月だと

    10日締は2014/11/11~2014/12/10 *5週目は2014/12/09と2014/12/10

    20日締は2014/11/21~2014/12/20 *5週目は2014/12/19と2014/12/20

    月末締は2014/11/01~2014/11/30 *5週目は2014/11/29と2014/12/30

    月末は解決できたのですが、2か月をまたぐ10、20締めが完成できません

    下記にコードを記載しました、ご教授お願いします。

    ALTER FUNCTION [dbo].[Func_5週目日付対象]
    (@Date varchar(8))
    RETURNS varchar(1)
    AS
    BEGIN
      --結果
      DECLARE @wkResult varchar(1)
      SET @wkResult=''
      --月の日数
      DECLARE @wkMonthDay numeric(13,0)
      --週の数
      DECLARE @wkWeek numeric(13,0)
      --週の余った日数
      DECLARE @wkRestDay numeric(13,0)
    
      --月日数
      SET @wkMonthDay=DAY(DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))
      --週の数を取得
      SET @wkWeek=ROUND((@wkMonthDay/7),0,1)
      --余った日数を取得
      SET @wkRestDay=@wkMonthDay-(@wkWeek*7)
    
      IF SUBSTRING(@Date,7,2)>@wkMonthDay-@wkRestDay
        BEGIN
          SET @wkResult='1'
        END
    
      --'1'=対象 ''=対象外
      RETURN @wkResult
    END

    2014年7月14日 1:12

回答

  • 期間の中にある末日を求め

    余りを期間最終日から減算した日付より大きかったら

    5週目対象とする事で解決しました

    お世話様でした

    • 回答としてマーク ジョウジ 2014年7月14日 4:13
    2014年7月14日 4:12

すべての返信

  • 期間の中にある末日を求め

    余りを期間最終日から減算した日付より大きかったら

    5週目対象とする事で解決しました

    お世話様でした

    • 回答としてマーク ジョウジ 2014年7月14日 4:13
    2014年7月14日 4:12
  • 解決されたようですが、折角ですので書いてみました。

    CREATE FUNCTION Is5thWeek
    (
        @対象日      date,
        @締日        int --- 99は月末とする。
    )
    RETURNS bit
    AS
    BEGIN
        declare @対象日の1ヶ月前の日                date;
        
        declare @対象日の1ヶ月前の締日              date;
        declare @対象日の1ヶ月前の締日から28日後    date;
        
        declare @対象日の月の締日                    date;
        
        declare @判定                                bit;
        
        if @締日 <> 99
        begin
            set @対象日の1ヶ月前の日 = dateadd(month, -1, @対象日);
    
            set @対象日の1ヶ月前の締日 = convert(date, datename(year, @対象日の1ヶ月前の日) + '-'
                                                         + datename(month, @対象日の1ヶ月前の日) + '-' 
                                                         +  convert(varchar(2), @締日));
    
            set @対象日の月の締日 = convert(date, datename(year, @対象日) + '-'
                                                         + datename(month, @対象日) + '-' 
                                                         +  convert(varchar(2), @締日));
                                                         
        end
        else
        begin        
            set @対象日の1ヶ月前の締日 = dateadd(day, -1, convert(date, datename(year, @対象日) + '-' + datename(month, @対象日) + '-01'));
    
            set @対象日の月の締日 = dateadd(day, -1, dateadd(month, 1, @対象日));
        end;
    
        set @対象日の1ヶ月前の締日から28日後 = dateadd(day, 28, @対象日の1ヶ月前の締日);
    
        if @対象日の1ヶ月前の締日から28日後 < @対象日 and @対象日 <= @対象日の月の締日
            set @判定 = 1;
        else
            set @判定 = 0;
            
        return @判定;
    END

    SQL Serverのバージョンがわからなかったのですが、SQL Server 2012以降ですと、DATEFROMPARTSやEOMONTH関数が使えますから、もうちょっとスマートに書けると思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    • 編集済み trapemiya 2014年7月14日 5:06 SQLで余計な行を削除
    2014年7月14日 5:05