【问题标题】:Query for valid records between two days and count by each day of latest month查询两天之间的有效记录,按最近一个月的每一天计算
【发布时间】:2018-10-08 08:38:06
【问题描述】:

表 ShopOrder 的列包括:

id   shopid starttime endtime 
1    123    2018-04-27  2018-04-28
2    234    2018-04-23  2018-04-30
3    189    2018-05-01  2018-05-30
4    321    2018-05-01  2018-05-29

我不想查询两天之间的有效店铺计数,而是按最近一个月的每一天计算,有效店铺计数是指开始时间

今天是2018-04-27,所以查询结果应该是:

day          count
2018-04-27    2
2018-04-26    1
2018-04-25    1
2018-04-24    1
2018-04-23    1
2018-04-22    0
2018-04-21    0
……………………………………
2018-03-26    0

我如何使用 MySQL 来实现这一点?

【问题讨论】:

  • 请说出你的逻辑。从您提供的示例中不清楚。

标签: mysql


【解决方案1】:

在开始日期和结束日期以及单个日期范围之间转换是 SQL 中的一项挑战,因为您可能没有包含当前月份每一天的行的表来加入。

您可以使用How to populate a table with a range of dates? 中的答案之一的逻辑在表格中填写日期。

或者,由于您要生成的范围很短,您可以在查询中手动创建它。由于您的示例范围为 4 月 26 日至 3 月 27 日,因此“最近一个月”的含义并不完全清楚,但如果过去 30 天足够合理,您可以使用 UNION 创建此列表。

Comparing date ranges 讨论如何测试日期是否在特定范围内,因此将两者放在一起会给您类似

SELECT
    DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) day,
    COUNT(ShopOrder.id) count
FROM
(SELECT 0 days UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
 SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION
 SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION
 SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION
 SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION
 SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29)
    AS days_ago
LEFT JOIN ShopOrder
    ON DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) <= ShopOrder.endtime
    AND DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) >= ShopOrder.starttime
GROUP BY days_ago.days;

【讨论】:

  • 这个想法非常棒,对我有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2010-09-18
  • 2012-03-12
  • 2012-10-28
相关资源
最近更新 更多