我必須根據條件計算兩天之前的日期。要計算在兩個工作日之前的日期,如果不工作日,則增加
例如date ='2012-09-01'then @date應該是'2012-08-30',但如果2012-08-31不是工作日,那麼@date應該是'2012-08-29' 。
你能幫我在這
我必須根據條件計算兩天之前的日期。要計算在兩個工作日之前的日期,如果不工作日,則增加
例如date ='2012-09-01'then @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日
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
請正確如果任何假設/測試案例不正確。
讓我知道你的關注。
非常感謝@Niladri Biswas它工作正常。優秀! –
試試這個:
SELECT MIN(DATE_COL)
FROM (
SELECT TOP 2 DATE_COL
FROM TBL_DATE
WHERE DATE_COL<='2012-09-01'
AND WORKDAYCOUNT =1)A
您是否在考慮假期? – will
您是否有日曆表或至少有工作日或非工作日的列表? –
是的,我有工作日的列表。如果工作日計數= 1,那麼它被計算爲工作日,否則非工作日....我需要條件... –