【问题标题】:MYSQL : Select count group by day with custom starting and ending hours for a dayMYSQL:按天选择计数组,并自定义一天的开始和结束时间
【发布时间】:2013-06-27 18:30:50
【问题描述】:

我喜欢按天、月、年对结果进行分组。我的问题是,在我的业务中,一天从下午 2 点 (14:00:00) 开始,到早上 8 点 (8:00:00) 结束。

这里的目标是计算一天中注册的唯一身份客户的数量。

我的桌子是这样的:

id      customer    join_date               leave_date              duration
6247    4043035     2013-06-07 14:32:00     2013-06-07 14:57:24     1524
6248    4006087     2013-06-07 14:32:11     2013-06-07 14:41:18     547
6249    4020103     2013-06-07 14:32:30     2013-06-07 15:24:32     3122
6250    4020103     2013-06-07 14:32:30     2013-06-07 14:41:18     528
6251    4020103     2013-06-07 14:32:30     2013-06-07 15:55:33     4983
6252    4049611     2013-06-07 14:34:14     2013-06-07 17:14:25     9611
6253    4049611     2013-06-07 14:34:14     2013-06-07 14:57:15     1381
6254    4046774     2013-06-07 14:36:21     2013-06-07 14:41:18     297
6255    4048402     2013-06-07 14:37:51     2013-06-07 14:41:18     207
6256    4006073     2013-06-07 14:39:54     2013-06-07 14:42:19     145
6257    4022477     2013-06-07 14:40:40     2013-06-07 14:46:44     364
6258    4049923     2013-06-07 14:42:08     2013-06-07 14:57:09     901
6259    4018158     2013-06-07 14:45:05     2013-06-07 14:45:43     38
6260    4010012     2013-06-07 14:45:39     2013-06-07 14:46:44     65
6261    4018158     2013-06-07 14:45:43     2013-06-07 14:53:16     453

在“正常”日子里,我的请求如下所示:

SELECT count(distinct l.customer) nbj,
       DAY(l.join_date) jour,
       MONTH(l.join_date) mois,
       str_to_date(l.join_date,'%Y-%m-%d') ordre
FROM log_waitingtime l
GROUP BY DAY(l.join_date), MONTH(l.join_date)
ORDER BY ordre ASC

效果很好。

我尝试了很多事情: http://forums.mysql.com/read.php?10,202789,202807 http://www.artfulsoftware.com/infotree/qrytip.php?id=819

我认为这些解决方案很复杂(我什至不了解所有内容。

那么,有没有更简单的方法在 SQL 中实现呢?

【问题讨论】:

    标签: mysql date group-by


    【解决方案1】:

    我会使用这个查询:

    SELECT
      MONTH(l.join_date - INTERVAL 14 HOUR) mois,
      DAY(l.join_date - INTERVAL 14 HOUR) jour,
      COUNT(distinct l.customer) nbj,
      str_to_date(l.join_date - INTERVAL 14 HOUR,'%Y-%m-%d') ordre
    FROM log_waitingtime l
    GROUP BY
      MONTH(l.join_date - INTERVAL 14 HOUR),
      DAY(l.join_date - INTERVAL 14 HOUR)
    ORDER BY
      ordre ASC
    

    【讨论】:

    • 我用where join_date >= '2013-06-12 14:00:00' and join_date <= '2013-06-13 8:00:00' 进行了另一次测试(与上一次测试不同的一天)。查询的结果是386。Fthiella解决方案返回395。我觉得还是有问题。我会做进一步的测试。
    • @Youpsla 我将时间向后移动 14 小时,所以如果加入日期是 2013-06-30 14:00:00,它将被计为 2013-06-30 00:00:00如果加入日期是 2013-07-01 08:00:00,它将被计为 2013-06-30 18:00:00,我希望这就是你要找的。您可能希望排除从上午 8 点到下午 2 点的加入日期(如果存在)。
    • @dianuj 我明白为什么我的结果不同了。例如,表中有客户在下午 2 点(13:52:24)之前有一个 join_date。我喜欢数那些人。然后我想我可以在早上 8 点开始一天,在第二天早上 7 点 59 分 59 分结束。那我想我可以用INTERVAL 8 HOUR 替换INTERVAL 14 HOUR 吗?
    • 我之前的评论是给你的。我的错,对不起。
    【解决方案2】:

    试试这个,它会显示在一天之间注册的客户 下午 2 点 (14:00:00) 上午 8 点 (8:00:00) 持续时间

    SELECT q.* FROM(  
        SELECT COUNT(DISTINCT l.customer) nbj,
         DATE_FORMAT(l.join_date,'%H:%i:%s') TIMEONLY,
           DAY(l.join_date) jour,
           MONTH(l.join_date) mois,
           STR_TO_DATE(l.join_date,'%Y-%m-%d') ordre
    FROM log_waitingtime l
    GROUP BY DAY(l.join_date), MONTH(l.join_date)    
    ) q WHERE q.TIMEONLY >= '14:00:00' OR q.TIMEONLY <= '08:00:00' 
    ORDER BY q.jour,q.mois, q.ordre ASC
    

    【讨论】:

    • 我直接完成了这个查询来测试两个建议的解决方案:SELECT count(distinct player) FROM 'log_waitingtime' where join_date &gt;= '2013-06-12 14:00:00' and join_date &lt;= '2013-06-13 8:00:00' and game_type = '4' and game_amount = '6'。结果是 366。只有 fthiella 提出的解决方案才能给出好的结果。 dianuj 解决方案返回 411。我没有足够的 SQL 技能来了解和理解 dianuj 失败的原因。但是感谢你们两位的快速回答。
    • 完整评论:我直接完成了这个查询来测试两个建议的解决方案:SELECT count(distinct player) FROM 'log_waitingtime' where join_date &gt;= '2013-06-12 14:00:00' and join_date &lt;= '2013-06-13 8:00:00'。 (在两种解决方案中,我在 FROM log_waitingtime l 之后添加了一个 WHERE 子句)。结果是 366。只有 fthiella 提出的解决方案才能给出好的结果。 dianuj 解决方案返回 411。我没有足够的 SQL 技能来了解和理解 dianuj 失败的原因。但是感谢你们两位的快速回答。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多