2009-10-11 36 views
1

我有一個很長的SQL查詢,用於特定「區域」中給定月份的所有用戶,計算它們已經運行的天數「義務」。這是分解到週末和工作日。這裏是PHP/SQL語句:修改SQL查詢以排除特定的日期

$result = mysql_query(" 

SELECT fname, lname, MONTH(eventDate) AS MONTH , 
    SUM(IF(WEEKDAY(eventDate) <=2, 1, 0) 
     OR IF(WEEKDAY(eventDate) = 6, 1, 0)) AS WeekdayCount, 
    SUM(IF(WEEKDAY(eventDate) = 4, 1, 0) 
     OR IF(WEEKDAY(eventDate) = 5, 1, 0) 
     OR IF(WEEKDAY(eventDate) = 3, 1, 0)) AS WeekendCount, 
    SUM(IF(secondary =0, 1, 0)) AS `Primary`, 
    SUM(IF(secondary =1, 1, 0)) AS `Secondary` 
FROM eventcal AS e 
LEFT JOIN users AS u ON e.primary = u.username 
WHERE e.region = '$region' AND MONTH(eventDate) = '$month' 
GROUP BY fname, lname, MONTH(eventDate) 
ORDER BY lname 

"); 

不幸的是,針對不同地區,每週不同的日子被認爲是週末和平日 - 你可以在上面看到。所以星期天可能不被認爲是一個週末。但這在這裏並不重要。

我的問題是,我想說:「不要在計數不包括二零零九年十月十日任何日 - 10月13日,2009年

有誰知道我怎麼能修改此SQL說?還是有一點點的PHP腳本,我可以寫

感謝

回答

3

您可以在WHERE子句中

AND eventDate NOT BETWEEN '2009-10-10' AND '2009-10-13' 

注意(只是 'GROUP BY' 前)加:?!聲明CA之間n功能不同取決於數據庫 - 它可以是包容性或排他性的,也就是說,它可以包含或排除正好落在開始或範圍的最終結果,所以也可以使用:

AND (eventDate<'2009-10-10' OR eventDate>'2009-10-13') 

還要注意,包括日期在純文本中,sql查詢在不同的數據庫中處理方式不同,因此請閱讀數據庫的文檔。以上將適用於postgres。

+0

有兩件事:首先,BETWEEN的含義決不會因符合標準的RDBMS而有所不同。 其次(這可能是您認爲BETWEEN可能會發生變化的原因):如果eventDate是時間戳類型並且可以包含非午夜值,那麼這兩個建議都不會起作用。要在10月10日至13日期間排除eventDate值,需要:AND(eventDate <'2009-10-10'OR eventDate> ='2009-10-14')。找到時間戳類型的「日期」列並不罕見,其中某些值僅作爲日期輸入(並且與時間=午夜一起存儲),並且一些值以一天的時間輸入。 BETWEEN建議將僅排除午夜定時值。 – 2009-10-11 20:58:27

+1

我補充說,因爲那是w3schools說的。我沒有意識到實現可能會有所不同,並沒有經歷過,但包括了這個,所以提問者沒有受到嚴重的衝擊。不過,我同意你的評論。 http://www.w3schools.com/Sql/sql_between.asp – pstanton 2009-10-12 02:24:45