2017-02-15 9 views
0

日付にいくつかの日を追加する必要があります.30としましょうが、30日はカレンダーの日にすることはできません。後ろのロジックに依存するパラメータです。月曜日と水曜日の間に30日間を加算する方法を見つける: 2月15日に30日を追加すると、4月26日を受け取るはずです 2月2日に30日(太陽から金) 15日、私は3月17日を取得する必要がありますSQLサーバーDATEADDの特定の週日

状況が十分ではない場合は、私はより良い説明を与えることを試みるつもりですアリに知らせてください。

ありがとうございました。

+0

あなたは営業日を意味するのですか? – McNets

+0

@McNets、まあ、まあ、就業日だけでなく、日曜日から金曜日まで、月曜日から金曜日まで...それはかなり変わりますが、各クエリーに必要な日を就業日として定義する方法があれば、その作業 – rhernandez

+0

ルックアップカレンダーテーブルはありますか? – McNets

答えて

1

まずアクティブフラグを変更させるために、私は、開始日と終了日の間に一連の日付を生成したが、それは、曜日を返します。

SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr 
     FROM  sys.columns c 
     )nbrs 
WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 

次にあなたが使用することができますインクルードしたい曜日を選択する単純なWHERE IN()と、返された日数を数えます。

DECLARE @StartDate DATE = '20170101' 
     , @EndDate DATE = '20170131' 

SELECT COUNT(*) AS DAYS 
FROM (
     SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow 
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr 
       FROM  sys.columns c 
       )nbrs 
     WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
    ) T1 
WHERE DOW IN (3,4,5); 

は、あなたがSET DATEFIRSTでそれを変更することができ、あなたのSQL Serverでの週のモミの日の世話をします。

は、ここでそれを確認してください:http://rextester.com/WCLIXM28868

+0

すごくいいですね!それを試し、あなたに知らせる! – rhernandez

+0

恐ろしい!これはまさに私が探していたものです。理解しやすく、簡単です。ありがとうございました! – rhernandez

+0

私は助けることができてうれしいです。 – McNets

1

私はこのように、再帰CTEでそれを行うだろう:

-- set datefirst as Sunday. You may need to adjust it ot the correct Datefirst value for your locale 
SET DATEFIRST 7 

declare @d datetime 
set @d = '2017-02-15' 
SELECT @d 

;with 
days as( 
-- this CTE where you define the active days. The days start 
select 1 as d, 0 as active -- sunday 
union 
select 2 as d, 1 as active -- monday 
union 
select 3 as d, 1 as active 
union 
select 4 as d, 1 as active 
union 
select 5 as d, 0 as active 
union 
select 6 as d, 0 as active 
union 
select 7 as d, 0 as active -- saturday 

), 
n as (
select CASE WHEN DATEPART(dw, DATEADD(d, 1, @d)) IN (select d from days where active=1) THEN 1 ELSE 0 END as n, @d as dt 
union all 
select CASE WHEN DATEPART(dw, DATEADD(d, 1, dt)) IN (select d from days where active=1) THEN n+1 else n end, DATEADD(d, 1, dt) 
from n where n < 30) 
--SELECT * from n order by n 
SELECT top 1 @d = dt from n order by n desc 

select @d 

上記のクエリは、月・水のためです。その日、金曜日は日CTE

+0

これはうまくいくかもしれませんが、CTE時には、私は日時(0 =日曜日、土曜日= 7日)を使うことができました。ありがとうございました! – rhernandez

+0

これはうまくいきますが、生産が遅いかもしれません – rhernandez

関連する問題