这很简单,可以非常有效地完成。
拿到订单和销售总额当天,做到这一点:
SELECT DATE(o.date_purchased) AS date_purchased,
SUM(ot.value) AS sales_today,
COUNT(*) AS orders_today
FROM orders AS o
JOIN orders_total AS ot ON ot.orders_id = o.orders_id
WHERE ot.class = 'ot_total'
AND o.date_purchased >= CURRENT_DATE()
AND o.date_purchased < CURRENT_DATE() + INTERVAL 1 DAY
GROUP BY DATE(ot.value)
注:所以我猜测一点我不明白您的订单和orders_total表。
要在一个小时的时间间隔报告,你看看上面的查询(与GROUP BY),你代替
DATE(ot.value) + INTERVAL HOUR(ot.value) HOUR
对于其中DATE(ot.value)
发生的两个地方。该表达式采用每个时间戳并将其转换为最近一小时的时间戳。例如,它将2014-01-01 11:15:22
变成2014-01-01 11:00
。当你按照这个价值分组时,你会得到你想要的。
你想要做的是报告两个小时的时间间隔。要做到这一点,你需要一个表达式来获取每个时间戳并将其转换为最近两个小时的时间间隔。例如,您需要将2014-01-01 11:15:22
转换为2014-01-01 10:00
。所以,我们需要提出一个表达来做到这一点。这里是。这是一个日期算术魔术。
DATE(ot.value) + INTERVAL (HOUR(ot.value) - HOUR(ot.value) MOD 2) HOUR
因此,您的两小时摘要查询看起来像这样。
SELECT DATE(o.date_purchased)
+ INTERVAL (HOUR(o.date_purchased)
- HOUR(o.date_purchased) MOD 2) HOUR AS time_purchased,
SUM(ot.value) AS sales_today,
COUNT(*) AS orders_today
FROM orders AS o
JOIN orders_total AS ot ON ot.orders_id = o.orders_id
WHERE ot.class = 'ot_total'
AND o.date_purchased >= CURRENT_DATE()
AND o.date_purchased < CURRENT_DATE() + INTERVAL 1 DAY
GROUP BY DATE(o.date_purchased)
+ INTERVAL (HOUR(o.date_purchased)
- HOUR(o.date_purchased) MOD 2) HOUR
请参阅此处以获取有关如何更一般地进行此时间间隔报告的说明。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/这种SQL看起来有点令人困惑,但它遵循一个简单的代码模式。
令人惊叹,近乎完美。但是,我怎样才能将这个结果分成两个小时的时间间隔,因为用您的查询我可以得到当天的总销售额和总订单。 –
我自己解决了它,只是增加了GROUP BY UNIX_TIMESTAMP(o.date_purchased)DIV 7200'。 –
看到我的编辑显示除了UNIX_ TIMESTAMP之外的另一个解决方案 –