2017-04-10 97 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