2

条件に基づいて、2日前の日付を計算する必要があります。

例 date = '2012-09-01' の場合、@date は '2012-08-30' である必要がありますが、ここで 2012-08-31 が営業日でない場合、@date は '2012-08-29' である必要があります。

これについて私を助けてくれませんか

4

2 に答える 2

1

あなたの質問は明らかに単純に見えますが、それに関連する多くのテストケースがあるため、そうではありません(少なくとも私はそのように解釈しました)。最初にクエリを書きましょう (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

仮定/テストケースのいずれかが正しくない場合は、親切に修正してください。

あなたの懸念を私に知らせてください。

于 2012-09-13T04:10:14.507 に答える