每个时段的 MySQL 查询小计,小时从当天下午 2 点到第二天下午 2 点

Posted

技术标签:

【中文标题】每个时段的 MySQL 查询小计,小时从当天下午 2 点到第二天下午 2 点【英文标题】:MySQL query subtotal per period where hour is from 2PM on day to 2PM the next day 【发布时间】:2019-02-19 23:12:49 【问题描述】:

我有一张金融交易日期时间和金额表。我已经按 ID 分组并对金额求和,但我想看看是否有一种纯 mysql 方法可以对每天下午 2 点到 2 点期间的这些金额进行小计。

也许使用 ROLLUP 语句?

这是我的查询的简化版本,它选择了从 2/01 到 2/05 的日期范围

SELECT 
    p.paidtime, 
    SUM(p.amount) as PaymentAmount 
FROM payments p 
WHERE (p.paidtime >= '2019-02-01' AND p.paidtime <= '2019-02-05' OR
    p.paidtime LIKE '2019-02-05%') 
GROUP BY p.requestID 
ORDER BY p.paidtime ASC

这会产生如下表格:

paidtime            PaymentAmount
2019-02-01 07:13:53 6809.00
2019-02-01 10:40:17 1605.81
2019-02-01 14:34:21 368.33
2019-02-01 15:18:13 3516.51
2019-02-01 15:25:14 292.74
2019-02-01 15:30:15 732.36
2019-02-01 15:49:39 2440.84
2019-02-02 09:52:39 2663.43
2019-02-04 09:00:09 265.00
2019-02-04 11:32:23 2307.48
2019-02-04 13:20:51 3878.66
2019-02-05 07:20:46 320.00
2019-02-05 07:38:02 154.08
2019-02-05 11:54:55 320.00
2019-02-05 12:02:53 1068.00
2019-02-05 12:04:56 17028.58
2019-02-05 13:28:21 4880.00
2019-02-05 14:25:02 70.00

但我希望看到的是这样的,在下午 2 点的断点处显示付款金额的小计。

paidtime            PaymentAmount
2019-02-01 07:13:53 6809.00
2019-02-01 10:40:17 1605.81
                    SUBTOTAL: 8414.81
2019-02-01 14:34:21 368.33
2019-02-01 15:18:13 3516.51
2019-02-01 15:25:14 292.74
2019-02-01 15:30:15 732.36
2019-02-01 15:49:39 2440.84
                    SUBTOTAL: $$$$
2019-02-02 09:52:39 2663.43
2019-02-04 09:00:09 265.00
2019-02-04 11:32:23 2307.48
                    SUBTOTAL: $$$$
2019-02-04 13:20:51 3878.66
2019-02-05 07:20:46 320.00
2019-02-05 07:38:02 154.08
2019-02-05 11:54:55 320.00
2019-02-05 12:02:53 1068.00
2019-02-05 12:04:56 17028.58
2019-02-05 13:28:21 4880.00
                    SUBTOTAL: $$$$
2019-02-05 14:25:02 70.00
                    SUBTOTAL: 70.00

我知道这可以通过 php 轻松完成并循环查看结果,但我想知道是否有一种方法可以完全在 MySQL 中创建小计?

【问题讨论】:

【参考方案1】:

切勿将like 与日期/时间值一起使用。 MySQL 有很多有用的日期时间函数。使用它们。

你可以通过减去 14 小时(或增加 10 小时)来做你想做的事:

SELECT DATE(p.paidtime - INTERVAL 14 HOUR),
       SUM(p.amount) AS PaymentAmount
FROM payments p
WHERE p.paidtime >= '2019-02-01 14:00:00' 
GROUP BY DATE(p.paidtime - INTERVAL 14 HOUR)
ORDER BY DATE(p.paidtime - INTERVAL 14 HOUR)

【讨论】:

以上是关于每个时段的 MySQL 查询小计,小时从当天下午 2 点到第二天下午 2 点的主要内容,如果未能解决你的问题,请参考以下文章

查询从会话表中获取高峰时段

查询以选择每小时最新的员工条目

如何高效地使用 SQL 检索半小时间隔的数据?

在 SQL 查询中将日期舍入到当天

mysql 8小时问题

限制mysql数据库表中数据插入的数量[重复]