条件に基づいて、2日前の日付を計算する必要があります。
例 date = '2012-09-01' の場合、@date は '2012-08-30' である必要がありますが、ここで 2012-08-31 が営業日でない場合、@date は '2012-08-29' である必要があります。
これについて私を助けてくれませんか
条件に基づいて、2日前の日付を計算する必要があります。
例 date = '2012-09-01' の場合、@date は '2012-08-30' である必要がありますが、ここで 2012-08-31 が営業日でない場合、@date は '2012-08-29' である必要があります。
これについて私を助けてくれませんか
あなたの質問は明らかに単純に見えますが、それに関連する多くのテストケースがあるため、そうではありません(少なくとも私はそのように解釈しました)。最初にクエリを書きましょう (Sql Server 2005 以降を使用していると仮定します)。
Declare @tbl_Data Table(Dates Date,WorkDayCount Int)
Insert Into @tbl_Data Select '2012-08-25',1
Insert Into @tbl_Data Select '2012-08-26',1
Insert Into @tbl_Data Select '2012-08-27',1
Insert Into @tbl_Data Select '2012-08-28',1
Insert Into @tbl_Data Select '2012-08-29',1
Insert Into @tbl_Data Select '2012-08-30',1
Insert Into @tbl_Data Select '2012-08-31',0
Insert Into @tbl_Data Select '2012-09-01',1
Declare @InputData Date = '2012-09-01'
;WITH CTE AS
(
SELECT Sequence = ROW_NUMBER() OVER(ORDER BY Dates DESC),*
FROM @tbl_Data
WHERE Dates < @InputData
)
,CTE2 AS
(
SELECT
Sequence = ROW_NUMBER() OVER(ORDER BY Dates DESC)
,Dates
,WorkDayCount
FROM
(
SELECT * FROM CTE WHERE Sequence = ((SELECT TOP 1 Sequence FROM CTE WHERE WorkDayCount = 1)-1)
UNION
SELECT TOP 2 * FROM CTE WHERE WorkDayCount = 1
)X
)
SELECT TOP 1
Date = CASE WHEN Sequence = 1 AND WorkDayCount = 0 THEN (SELECT Dates FROM CTE2 WHERE Sequence = 3)
WHEN Sequence = 1 AND WorkDayCount = 1 THEN (SELECT Dates FROM CTE2 WHERE Sequence = 2)
END
FROM CTE2
ケース 1: 入力日が 9 月 1 日 (2012-09-01) で、直前の日付の WorkDayCount = 0
結果: 2012-08-29
理由: 8 月 31 日の WorkDayCount = 0 であるため、稼働日は 8 月 29 日になります。
ケース 2: 入力日が 9 月 1 日 (2012-09-01) で、8 月 31 日 + 8 月 30 日の WorkCount = 0。
結果: 2012-08-28
ケース 3: 入力日が 9 月 1 日 (2012-09-01) で、直前の日付の WorkDayCount = 1
結果: 2012-08-30
仮定/テストケースのいずれかが正しくない場合は、親切に修正してください。
あなたの懸念を私に知らせてください。