【问题标题】:Modifying an SQL query to exclude particular dates修改 SQL 查询以排除特定日期
【发布时间】:2023-03-30 12:16:02
【问题描述】:

我有一个很长的 SQL 查询,用于针对特定“区域”中的所有用户在给定月份计算他们“值班”的天数。这分为周末和工作日。这是 php/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

");

很遗憾,对于不同的地区,一周中的不同日子被视为周末和工作日 - 正如您在上面看到的那样。所以星期天可能不被认为是周末。但这在这里并不重要。

我的问题是,我想说:“不要将 2009 年 10 月 10 日至 2009 年 10 月 13 日之间的任何日子都包括在计数中。

有谁知道我可以如何修改这个 SQL 来说明这一点?或者有什么我可以写的PHP小脚本?

谢谢!

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    您可以添加 where 子句(就在 'GROUP BY' 之前)

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

    注意:根据数据库, between 语句的功能可能不同 - 它可以是包含或排除的,即它可能包含或排除恰好落在范围开始或结束的结果,因此:

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

    另请注意,在纯文本 sql 查询中包含日期在不同数据库上的处理方式不同,因此请阅读数据库的文档。以上将适用于 postgres。

    【讨论】:

    • 两件事:首先,BETWEEN 的含义在符合标准的 RDBMS 中永远不会有所不同。第二(这可能是您认为 BETWEEN 可以变化的原因):如果 eventDate 是时间戳类型并且可以包含非午夜值,则这两种建议都不起作用。要在 10 月 10 日至 13 日期间排除 eventDate 值,需要:AND (eventDate='2009-10-14')。经常会发现时间戳类型的“日期”列,其中一些值仅作为日期输入(并以时间 = 午夜的形式存储),而另一些则以一天中的时间输入。 BETWEEN 建议将仅排除午夜时间值。
    • 我补充说,因为这就是 w3schools 所说的。我没有意识到实现可能会有所不同,也没有经历过,但包括在内,所以提问者没有受到严重的冲击。不过,我同意你的评论。 w3schools.com/Sql/sql_between.asp
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2021-01-26
    相关资源
    最近更新 更多