Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 返回过去24小时内每小时的计数,并用零填充空格_Mysql_Sql - Fatal编程技术网

Mysql 返回过去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

我正在尝试获取一个记录集,其中记录了过去24小时内每小时的销售额,用零填充空小时

我的示例数据集如下所示,包含两个测试行:

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分组所做的