2012-04-05 68 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