2009-10-11 142 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