2017-04-10 101 views
2

我有一個工作正常的查詢。 查詢基本上從當前日期6-8天之間檢索數據。在測量數據的年齡時,我想排除週末。從我的查詢中排除週末

例如:如果一個記錄是星期五登記的,那麼星期一早上它會顯示它是4天前的樣子,但實際上只有2天,因爲Satuday和Sunday不應該統計。

我想這一點,這似乎並不奏效:

Select id, name, CreatedDate 
from table 
where 
CreatedDate <= DATEADD(day, -6, GETDATE()) AND CreatedDate >= DATEADD(day, -8, GETDATE()) -- here I get data between 6-8 days old 
AND ((DATEPART(dw, CreatedDate) + @@DATEFIRST) % 7) NOT IN (0, 1) -- Here im trying to exclude weekends 

我在做什麼錯?

回答

2

你可以看到日曆,並嘗試此查詢

// Logic is very simple. 
// See calendar and try. 
// If today is Monday, then Prev8workingdays will include 
// 8 working days + 2 weekends = 12 days. 
// Then result will be dateadd(day,-12, getdate()) = 12 days before today. 
// Same logic for other days week 
DECLARE @Prev8workingdays date = CASE 
    WHEN datepart(dw, getdate()) IN (2,3,4) THEN dateadd(day,-12, getdate()) 
    WHEN datepart(dw, getdate()) IN (1) THEN dateadd(day,-11, getdate()) 
    ELSE dateadd(day,-10, getdate()) 
    END 
DECLARE @Pre6WorkingDay date = CASE 
     WHEN datepart(dw, getdate()) IN (2) THEN dateadd(day,-10, getdate()) 
     WHEN datepart(dw, getdate()) IN (1) THEN dateadd(day,-9, getdate()) 
     ELSE dateadd(day,-8, getdate()) 
    END 

SELECT sd.* FROM 
@SampleDate sd 
WHERE sd.CreatedDate >= @Prev8workingdays AND sd.CreatedDate <= @Pre6WorkingDay 

參考鏈接DATEADD

+0

嗨,我只是試了一下。所以基本上這會衡量一個記錄的年齡而不考慮週末? 你能解釋一下dateadd(day,-12)和(-11)的作用嗎?如果我想測量5天內的情況怎麼辦? – MishMish

+0

我編輯了我的答案來解釋... – TriV

2

你可以試試:

 WHERE DATEPART(dw, date_created) NOT IN (1, 7); 
+3

這將工作,假設DA TEFIRST = 7.另外,爲了清楚起見,我只是說週日而不是dw。 – scsimon

+0

這是否會測量數據的年齡而不計算測量中的週末? – MishMish

+0

不是這是替代AND((DATEPART(dw,CreatedDate)+ @@ DATEFIRST)%7)NOT IN(0,1) – SergeS

1

試試這個:

Select id, name, CreatedDate 
from table 
where CreatedDate < GETDATE()-6 and CreatedDate > GETDATE()-8 and 
((DATEPART(dw, CreatedDate) + @@DATEFIRST) % 7) NOT IN (0, 1) 
+0

這是測量數據的年齡而不計算週末的測量嗎? – MishMish