Mysql 返回过去24小时内每小时的计数,并用零填充空格
我正在尝试获取一个记录集,其中记录了过去24小时内每小时的销售额,用零填充空小时 我的示例数据集如下所示,包含两个测试行:Mysql 返回过去24小时内每小时的计数,并用零填充空格,mysql,sql,Mysql,Sql,我正在尝试获取一个记录集,其中记录了过去24小时内每小时的销售额,用零填充空小时 我的示例数据集如下所示,包含两个测试行: id | saleID | amount | created ---|-------------------|-------------|------------- 1 | 6032b317-1533... | 20000 | 2019-01-10 23:56:40 2 | 43556fg6-5344... | 60000
id | saleID | amount | created
---|-------------------|-------------|-------------
1 | 6032b317-1533... | 20000 | 2019-01-10 23:56:40
2 | 43556fg6-5344... | 60000 | 2019-01-11 18:06:32
例如,当前时间是18:10,因此我要查找的结果是:
| hourOrderID | saleHour | saleHourTotal |
| ----------- | -------- | ------------- |
| 1 | 18:00 | 1 |
| 2 | 17:00 | 0 |
| 3 | 16:00 | 0 |
| 4 | 15:00 | 0 |
| 5 | 14:00 | 0 |
| 6 | 13:00 | 0 |
| 7 | 12:00 | 0 |
| 8 | 11:00 | 0 |
| 9 | 10:00 | 0 |
| 10 | 9:00 | 0 |
| 11 | 8:00 | 0 |
| 12 | 7:00 | 0 |
| 13 | 6:00 | 0 |
| 14 | 5:00 | 0 |
| 15 | 4:00 | 0 |
| 16 | 3:00 | 0 |
| 17 | 2:00 | 0 |
| 18 | 1:00 | 0 |
| 19 | 0:00 | 0 |
| 20 | 23:00 | 1 |
| 21 | 22:00 | 0 |
| 22 | 21:00 | 0 |
| 23 | 20:00 | 0 |
| 24 | 19:00 | 0 |
| 25 | 18:00 | 0 |
请注意;今天18:00-19:00之间有1次减价,昨天18:00-19:00之间有0次减价。这是我的问题
我实际得到的结果是:
| hourOrderID | saleHour | saleHourTotal |
| ----------- | -------- | ------------- |
| 1 | 18:00 | 1 |
| 2 | 17:00 | 0 |
| 3 | 16:00 | 0 |
| 4 | 15:00 | 0 |
| 5 | 14:00 | 0 |
| 6 | 13:00 | 0 |
| 7 | 12:00 | 0 |
| 8 | 11:00 | 0 |
| 9 | 10:00 | 0 |
| 10 | 9:00 | 0 |
| 11 | 8:00 | 0 |
| 12 | 7:00 | 0 |
| 13 | 6:00 | 0 |
| 14 | 5:00 | 0 |
| 15 | 4:00 | 0 |
| 16 | 3:00 | 0 |
| 17 | 2:00 | 0 |
| 18 | 1:00 | 0 |
| 19 | 0:00 | 0 |
| 20 | 23:00 | 1 |
| 21 | 22:00 | 0 |
| 22 | 21:00 | 0 |
| 23 | 20:00 | 0 |
| 24 | 19:00 | 0 |
| 25 | 18:00 | 1 | <----- this isn't yesterday, it's today
你可以:哦
我很想这样,片场的最后一个小时是前一天,但我的大脑已经决定它不能再往前走了,需要帮助
我尝试在25小时内添加另一个UNION
,并尝试将时间范围延长到25小时,但结果与我想要的相差甚远:
AND ets.created > DATE_SUB(UTC_TIMESTAMP, INTERVAL 25 HOUR
请建议可以进行哪些更改以使其按预期工作。我在评论部分采纳了@草莓的建议,并决定进行此应用程序级别的更改,它现在非常有意义,因为它更易于阅读。我不后悔尝试SQL版本,因为我学到了一点 我在下面发布了我使用的解决方案,它是用PHP为任何需要类似东西的人提供的。如果有人有比这更有效的解决方案,请在评论中分享 查询:
SELECT
CONCAT(DATE_FORMAT(created, '%Y-%m-%d %H'), ':00:00') AS saleHour,
SUM(amount) AS totalSales
FROM eventTicketSales
WHERE created BETWEEN DATE_SUB(UTC_TIMESTAMP(), INTERVAL 24 HOUR) AND UTC_TIMESTAMP
GROUP BY HOUR(created);
saleHour totalSales
2019-01-11 17:00:00 10000
2019-01-10 23:00:00 20000
$hours = 24 + 1;
for ($i=0; $i<$hours; $i++) {
$date = date('Y-m-d H', strtotime('-'.$i.' HOUR')).':00:00';
$key = array_search($date, array_column($salesIn24Hours, 'saleHour'));
if ($key !== FALSE) {
echo $date . ' ' . $salesIn24Hours[$key]['totalSales'] . '<br>';
} else {
echo $date . ' 0' . '<br>';
}
}
2019-01-11 21:00:00 0
2019-01-11 20:00:00 0
2019-01-11 19:00:00 0
2019-01-11 18:00:00 0
2019-01-11 17:00:00 10000
2019-01-11 16:00:00 0
2019-01-11 15:00:00 0
2019-01-11 14:00:00 0
2019-01-11 13:00:00 0
2019-01-11 12:00:00 0
2019-01-11 11:00:00 0
2019-01-11 10:00:00 0
2019-01-11 09:00:00 0
2019-01-11 08:00:00 0
2019-01-11 07:00:00 0
2019-01-11 06:00:00 0
2019-01-11 05:00:00 0
2019-01-11 04:00:00 0
2019-01-11 03:00:00 0
2019-01-11 02:00:00 0
2019-01-11 01:00:00 0
2019-01-11 00:00:00 0
2019-01-10 23:00:00 20000
2019-01-10 22:00:00 0
2019-01-10 21:00:00 0
结果:
SELECT
CONCAT(DATE_FORMAT(created, '%Y-%m-%d %H'), ':00:00') AS saleHour,
SUM(amount) AS totalSales
FROM eventTicketSales
WHERE created BETWEEN DATE_SUB(UTC_TIMESTAMP(), INTERVAL 24 HOUR) AND UTC_TIMESTAMP
GROUP BY HOUR(created);
saleHour totalSales
2019-01-11 17:00:00 10000
2019-01-10 23:00:00 20000
$hours = 24 + 1;
for ($i=0; $i<$hours; $i++) {
$date = date('Y-m-d H', strtotime('-'.$i.' HOUR')).':00:00';
$key = array_search($date, array_column($salesIn24Hours, 'saleHour'));
if ($key !== FALSE) {
echo $date . ' ' . $salesIn24Hours[$key]['totalSales'] . '<br>';
} else {
echo $date . ' 0' . '<br>';
}
}
2019-01-11 21:00:00 0
2019-01-11 20:00:00 0
2019-01-11 19:00:00 0
2019-01-11 18:00:00 0
2019-01-11 17:00:00 10000
2019-01-11 16:00:00 0
2019-01-11 15:00:00 0
2019-01-11 14:00:00 0
2019-01-11 13:00:00 0
2019-01-11 12:00:00 0
2019-01-11 11:00:00 0
2019-01-11 10:00:00 0
2019-01-11 09:00:00 0
2019-01-11 08:00:00 0
2019-01-11 07:00:00 0
2019-01-11 06:00:00 0
2019-01-11 05:00:00 0
2019-01-11 04:00:00 0
2019-01-11 03:00:00 0
2019-01-11 02:00:00 0
2019-01-11 01:00:00 0
2019-01-11 00:00:00 0
2019-01-10 23:00:00 20000
2019-01-10 22:00:00 0
2019-01-10 21:00:00 0
存储在$salesin24小时内
逻辑:
SELECT
CONCAT(DATE_FORMAT(created, '%Y-%m-%d %H'), ':00:00') AS saleHour,
SUM(amount) AS totalSales
FROM eventTicketSales
WHERE created BETWEEN DATE_SUB(UTC_TIMESTAMP(), INTERVAL 24 HOUR) AND UTC_TIMESTAMP
GROUP BY HOUR(created);
saleHour totalSales
2019-01-11 17:00:00 10000
2019-01-10 23:00:00 20000
$hours = 24 + 1;
for ($i=0; $i<$hours; $i++) {
$date = date('Y-m-d H', strtotime('-'.$i.' HOUR')).':00:00';
$key = array_search($date, array_column($salesIn24Hours, 'saleHour'));
if ($key !== FALSE) {
echo $date . ' ' . $salesIn24Hours[$key]['totalSales'] . '<br>';
} else {
echo $date . ' 0' . '<br>';
}
}
2019-01-11 21:00:00 0
2019-01-11 20:00:00 0
2019-01-11 19:00:00 0
2019-01-11 18:00:00 0
2019-01-11 17:00:00 10000
2019-01-11 16:00:00 0
2019-01-11 15:00:00 0
2019-01-11 14:00:00 0
2019-01-11 13:00:00 0
2019-01-11 12:00:00 0
2019-01-11 11:00:00 0
2019-01-11 10:00:00 0
2019-01-11 09:00:00 0
2019-01-11 08:00:00 0
2019-01-11 07:00:00 0
2019-01-11 06:00:00 0
2019-01-11 05:00:00 0
2019-01-11 04:00:00 0
2019-01-11 03:00:00 0
2019-01-11 02:00:00 0
2019-01-11 01:00:00 0
2019-01-11 00:00:00 0
2019-01-10 23:00:00 20000
2019-01-10 22:00:00 0
2019-01-10 21:00:00 0
(就语法而言,我假设您使用的是MySQL。)
为了从单个SELECT
语句中生成25行数据,您需要一个包含25行的表(真或假),这正是内部SELECT
所做的。在展示实际构造内部表的更简单方法之前,我建议向其添加更多列(假设当前时间为12月31日下午6点):
那么您的查询将非常简单:
SELECT
aux.hourOrderID,
aux.saleHour,
COALESCE(COUNT(ets.saleID), 0) AS saleHourTotal
FROM madeUpTable AS aux LEFT JOIN eventTicketSales AS ets
ON aux.startTime <= ets.created AND ets.created < aux.endTime
GROUP BY aux.hourOrderID
ORDER BY hourOrderID
选择
奥克斯·霍罗德里德,
辅助营业时间,
合并(计数(ets.saleID),0)为saleHourTotal
从madeUpTable AS aux LEFT将事件票证售为ets
在aux.startTime上,交付表中的id范围1到25对于初学者来说看起来很复杂。。id 25永远不能与HOUR(ets.created)=aux.dh匹配考虑在应用程序中处理数据显示问题code@Strawberry我打算处理显示应用程序级别hourOrderID
和saleHour
纯粹是为了帮助我在构建查询时理解查询,并让其他人在这方面帮助我。我只需要saleHourTotal
来绘制我想要绘制的图表。@草莓还是你的意思是我应该在应用程序级别中填写缺失的日期?我想这是我按Salehour分组所做的