2012-09-13 25 views
2

我必須根據條件計算兩天之前的日期。要計算在兩個工作日之前的日期,如果不工作日,則增加

例如date ='2012-09-01'then @date應該是'2012-08-30',但如果2012-08-31不是工作日,那麼@date應該是'2012-08-29' 。

你能幫我在這

+1

您是否在考慮假期? – will

+0

您是否有日曆表或至少有工作日或非工作日的列表? –

+0

是的,我有工作日的列表。如果工作日計數= 1,那麼它被計算爲工作日,否則非工作日....我需要條件... –

回答

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日

CASE 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

請正確如果任何假設/測試案例不正確。

讓我知道你的關注。

+0

非常感謝@Niladri Biswas它工作正常。優秀! –

0

試試這個:

SELECT MIN(DATE_COL) 
FROM (
     SELECT TOP 2 DATE_COL 
     FROM TBL_DATE 
     WHERE DATE_COL<='2012-09-01' 
     AND WORKDAYCOUNT =1)A 
相關問題