php - 查询输出中缺少 DATETIME 值,然后自动填充缺少的值并获得正确的输出

标签 php mysql datetime codeigniter-3

当我以一秒的间隔从数据库中获取数据时,仅获得可用的 DateTime 间隔输出计数,并且输出中缺少一些 DateTime 间隔。

我用计数 0 填充所有缺失的 DateTime 间隔。

示例:

如果开始日期:2019-10-15 02:36:23

结束日期:2019-10-15 03:36:22

以一秒的间隔获取一小时的数据,如果该时间不可用,则获取 0 计数。

mysql> select start_date,count(id) as count from live_login where start_date >= '2019-10-15 02:36:23' GROUP BY UNIX_TIMESTAMP(start_date) DIV 1;
+---------------------+-------+
| start_date           | count |
+---------------------+-------+
| 2019-10-15 02:36:23 |     1 |
| 2019-10-15 02:36:24 |     1 |
| 2019-10-15 02:36:26 |     1 |
| 2019-10-15 02:36:55 |     1 |
| 2019-10-15 02:36:57 |     1 |
| 2019-10-15 02:37:08 |     1 |

输出需要这样:

| start_date           | count |
+---------------------+-------+
| 2019-10-15 02:36:23 |     1 |
| 2019-10-15 02:36:24 |     1 |
| 2019-10-15 02:36:25 |     0 |
| 2019-10-15 02:36:26 |     1 |
| 2019-10-15 02:36:27 |     0 |
| 2019-10-15 02:36:28 |     0 |
| 2019-10-15 02:36:29 |     0 |
| 2019-10-15 02:36:30 |     0 |
| 2019-10-15 02:36:31 |     0 |
| 2019-10-15 02:36:32 |     0 |
| 2019-10-15 02:36:33 |     0 |
| 2019-10-15 02:36:34 |     0 |
| 2019-10-15 02:36:35 |     0 |

最佳答案

您可以创建一个虚拟表,其中包含适当范围内的所有秒数,然后将它们加入到摘要中。
尝试像这样修改查询:

    SELECT COUNT(id) AS count,
        listofseconds.login_date
    FROM (
        SELECT mintime + INTERVAL seq.seq SECOND AS login_date
        FROM (
                SELECT '2019-10-15 02:36:23' AS mintime,
                (SELECT DATE_ADD('2019-10-15 02:36:23', INTERVAL '59:59' MINUTE_SECOND)) AS maxtime
                FROM live_login
            ) AS minmax
        JOIN seq_0_to_999999 AS seq ON seq.seq < TIMESTAMPDIFF(SECOND,mintime,maxtime)
        ) AS listofseconds

    LEFT JOIN live_login ON listofseconds.login_date = SECOND(live_login.start_date)
    GROUP BY SECOND(listofseconds.login_date)
    ORDER BY SECOND(listofseconds.login_date)

此查询的 end_date2019-10-15 03:36:22:

SELECT DATE_ADD('2019-10-15 02:36:23', INTERVAL '59:59' MINUTE_SECOND)

此查询将获取范围内的秒:

        SELECT mintime + INTERVAL seq.seq SECOND AS login_date
        FROM (
                SELECT '2019-10-15 02:36:23' AS mintime,
                (SELECT DATE_ADD('2019-10-15 02:36:23', INTERVAL '59:59' MINUTE_SECOND)) AS maxtime
                FROM live_login
            ) AS minmax
        JOIN seq_0_to_999999 AS seq ON seq.seq < TIMESTAMPDIFF(SECOND,mintime,maxtime)

关于php - 查询输出中缺少 DATETIME 值,然后自动填充缺少的值并获得正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407753/

相关文章:

php - 在 PHP 中获取本地机器 IP 地址

php - Linux - 通过 PHP 创建用户

mysql - SQL 删除 MIN 加上一组中的下一个最大的

mysql - SQL查询分组按日期洗牌

php - Codeigniter:Ion auth 重置密码

sql - 如何比较 SQL Server 中的时间?

PHP创建多个目录

php - 发送消息回调后的jaxl

flutter - Dart/Flutter DateTime difference inDays error for March 31 April 1

c# - DateTime 比较忽略类型?