2012-04-05 39 views
0

我被困在一个点,我必须排除周末的门票,并需要计算其他门票(仅工作日)。如何排除整个月的周末数据?

让我们假设:

tickets    dates 
-----------   ---------- 
123     04/05/2012 
231     04/06/2012 
111     04/07/2012 
112     04/08/2012 
113     04/09/2012 

所以,在上表中,我们有5天,包括工作日和周末数据。

我只需要在我的决赛桌平日数据不是周末是这样的:

tickets    dates 
-----------   ---------- 
123     04/05/2012 
231     04/06/2012 
113     04/09/2012 
+0

[你有什么尝试?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Ben 2012-04-05 21:41:42

回答

3

不要打扰DATEFIRST。这可能会导致问题

select * from @t 
where datediff(d, 0, dates)%7 < 5 

编辑: DATEFIRST是从数据库到数据库中的不同。所以你需要在使用本周的'DatePart(dw,日期)' 之前设置datefirst。这意味着每次运行该脚本时都应该调用该日期。如果你决定把它放在一个函数中,你会因为不能在该函数中使用它而被拧紧。所以每次你调用这个函数时,你都依赖于记住datefirst部分的人。

我的解决方案不依赖于数据库的单独设置。

它的作用是这样的:

计算0代表1900-01-01(星期一)和日期之间的天数。

模数7是0(星期一)和6(星期日)之间的日数,所以小于5是工作日。

+0

+1这很聪明,但我认为你应该解释为什么这会起作用。不明显'0'代表什么。 – 2012-04-06 13:40:55

+1

@MikaelEriksson你是对的。我太懒了 – 2012-04-06 15:12:31

+0

聪明...好的话,是表现到“传统”的方式媲美吗?从臀部拍摄它似乎应该是。 – RThomas 2012-04-06 16:52:25

1

您通常使用一套datefirst的组合和datepart功能来过滤掉工作日或周末在查询中。你没有太多的表结构的方式,所以使用以下仅作为粗略的指导。

一个例子是这样的:

set datefirst 1; /* treat monday as first day of week */ 

select tickets from mytable 
    where datepart(dw,mydate) < 6; /* select days 1 - 5 only */ 
+0

感谢您的回复看起来不错,但如果日期是在1日至31日。我们需要排除周末,只需要获取周日数据。 – Shahsra 2012-04-05 22:18:54

+0

@Shahsra每周的星期不同于每月的每日...每周的星期几是1 - 7,每月的一天是1 - 31. – 2012-04-05 22:46:34

1
Select * From Tickets Where DatePart(dw,dates) between 2 And 6 

假设星期天是一个天

你可以乱用与SET DATEFIRST

+1

但是,如果我们使用此代码,它只会显示日期2和日期6,但如果我们希望第一和第三十一日之间的数据不包括周末呢? – Shahsra 2012-04-05 22:16:00

+1

@Shahsra每周的星期不同于每月的每日...每周的星期几是1 - 7,本月的一天是1 - 31. – 2012-04-05 22:46:51

+0

已投票的错误评论...哎呀 – RThomas 2012-04-05 22:58:42