SQL查询求助:指定日期区间内每日固定时段交易次数统计
解决思路与SQL实现方案
核心逻辑拆解
要统计指定日期区间内每日13:00-16:00的交易次数,关键是把交易时间拆分为日期维度和时间维度分别处理:
- 先筛选出落在2022年9月1日至10月1日的交易记录
- 再过滤出交易时间处于13:00到16:00之间的条目
- 按日期分组,统计每组的交易数量
分数据库实现示例
不同数据库的日期处理函数略有差异,以下是几种主流数据库的实现代码:
MySQL/MariaDB
SELECT DATE(transaction_time) AS trade_date, COUNT(*) AS transaction_count FROM transactions WHERE -- 日期范围:包含9月1日,不包含10月1日(需包含10月1日则改为 transaction_time <= '2022-10-01 23:59:59') transaction_time >= '2022-09-01 00:00:00' AND transaction_time < '2022-10-01 00:00:00' -- 时间范围:包含13:00,不包含16:00(需包含16:00则改为 TIME(transaction_time) <= '16:00:00') AND TIME(transaction_time) >= '13:00:00' AND TIME(transaction_time) < '16:00:00' GROUP BY DATE(transaction_time) ORDER BY trade_date;
PostgreSQL
SELECT DATE(transaction_time) AS trade_date, COUNT(*) AS transaction_count FROM transactions WHERE transaction_time >= '2022-09-01'::TIMESTAMP AND transaction_time < '2022-10-01'::TIMESTAMP -- 13到15点对应13:00-15:59:59,需包含16:00则改为 BETWEEN 13 AND 16 AND EXTRACT(HOUR FROM transaction_time) BETWEEN 13 AND 15 GROUP BY DATE(transaction_time) ORDER BY trade_date;
SQL Server
SELECT CONVERT(DATE, transaction_time) AS trade_date, COUNT(*) AS transaction_count FROM transactions WHERE transaction_time >= '2022-09-01' AND transaction_time < '2022-10-01' AND DATEPART(HOUR, transaction_time) >= 13 AND DATEPART(HOUR, transaction_time) < 16 GROUP BY CONVERT(DATE, transaction_time) ORDER BY trade_date;
常见问题排查
- 字段类型问题:确保
transaction_time是datetime/timestamp类型,若为字符串格式,需先转换为日期类型(比如MySQL用STR_TO_DATE(transaction_time, '%m/%d/%Y %H:%i:%s')) - 边界值误差:明确需求是否包含10月1日当天,以及16:00整的交易,调整
>=/<=/<等运算符 - 时区不一致:确认数据库时区与业务时区匹配,避免因时区偏移导致时间过滤错误
- 分组维度错误:必须按纯日期分组,若带时间部分会导致同天内按小时/分钟拆分分组,统计结果不符合预期
内容的提问来源于stack exchange,提问作者tkarim
相关产品推荐
相关产品推荐

