在日常的SQL查询时,难免会遇到一些求时间段内的数据问题,那我现在就带大家来感受一些常见的一些时间段的数据查询。
下面是我的表结构,后面都将通过这个表查询数据。
CREATE TABLE `time_data` (
`id` int NOT NULL,
`num` int NULL DEFAULT NULL,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`datetime` datetime NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
一、按小时进行数据的统计
下面的是我数据库的数据,后面按小时查询统计都按照数据这个查询
1.查询三小时的数据
查询每三小时的数据,可以将每天分为8个三小时,然后查询数据执行查询代码,其中datetime为你数据库中的时间字段,Time_Range为别名 ,time_data为你的表名,CONCAT(DATE_FORMAT(datetime, '%Y-%m-%d'), ' '为拼接语句,我是按标准时间格式的年月日加后面的字段进行拼接的,当然你也可以自定义;0:00-2:59也是可以自定义的
SELECT NAME,SUM(num) AS total_num,
CONCAT(DATE_FORMAT(datetime, '%Y-%m-%d'), ' ',
CASE
WHEN HOUR() >= 0 AND HOUR(datetime) < 3 THEN '0:00-2:59'
WHEN HOUR(datetime) >= 3 AND HOUR(datetime) < 6 THEN '3:00-5:59'
WHEN HOUR(datetime) >= 6 AND HOUR(datetime) < 9 THEN '6:00-8:59'
WHEN HOUR(datetime) >= 9 AND HOUR(datetime) < 12 THEN '9:00-11:59'
WHEN HOUR(datetime) >= 12 AND HOUR(datetime) < 15 THEN '12:00-14:59'
WHEN HOUR(datetime) >= 15 AND HOUR(datetime) < 18 THEN '15:00-17:59'
WHEN HOUR(datetime) >= 18 AND HOUR(datetime) < 21 THEN '18:00-20:59'
WHEN HOUR(datetime) >= 21 AND HOUR(datetime) < 24 THEN '21:00-23:59'
END) AS Time_Range
FROM time_data
GROUP BY NAME, Time_Range
查看结果
这样我们就统计除了每三个小时的数据。我统计的是num的总数
2、查询六小时的数据
执行查询代码
SELECT NAME,SUM(num) AS total_num,
CONCAT(DATE_FORMAT(datetime, '%Y-%m-%d'), ' ',
CASE
WHEN HOUR() >= 0 AND HOUR(datetime) < 3 THEN '0:00-2:59'
WHEN HOUR(datetime) >= 3 AND HOUR(datetime) < 6 THEN '3:00-5:59'
WHEN HOUR(datetime) >= 6 AND HOUR(datetime) < 9 THEN '6:00-8:59'
WHEN HOUR(datetime) >= 9 AND HOUR(datetime) < 12 THEN '9:00-11:59'
WHEN HOUR(datetime) >= 12 AND HOUR(datetime) < 15 THEN '12:00-14:59'
WHEN HOUR(datetime) >= 15 AND HOUR(datetime) < 18 THEN '15:00-17:59'
WHEN HOUR(datetime) >= 18 AND HOUR(datetime) < 21 THEN '18:00-20:59'
WHEN HOUR(datetime) >= 21 AND HOUR(datetime) < 24 THEN '21:00-23:59'
END) AS Time_Range
FROM time_data
GROUP BY NAME, Time_Range
查看结果
可以看到 我们就统计出了每六个小时的数据。我统计的是num的总数
2、查询十二小时的数据
SELECT NAME,SUM(num) AS total_num,
CONCAT(DATE_FORMAT(datetime, '%Y-%m-%d'), ' ',
CASE
WHEN HOUR(datetime) >= 0 AND HOUR(datetime) < 12 THEN '00:00-11:59'
WHEN HOUR(datetime) >= 12 AND HOUR(datetime) < 24 THEN '12:00-23:59'
END) AS Time_Range
FROM time_data
GROUP BY NAME, Time_Range
查看结果
这样我们就统计除了每十二个小时的数据。我统计的是num的总数
二、按天进行数据统计
表中数据如下
执行查询代码
SELECT NAME,SUM(num) AS total_num,
DATE_FORMAT(datetime, '%Y-%m-%d') as DAY
FROM time_data
GROUP BY NAME, DAY
查看结果
可以看到 我们就统计出了每天的数据。我统计的是num的总数
三、按月进行数据统计
表中数据如下
执行查询代码
SELECT NAME,SUM(num) AS total_num,
DATE_FORMAT(datetime, '%Y-%m') as Month
FROM time_data
GROUP BY NAME, Month
查看结果
可以看到 我们就统计出了每个月的数据。我统计的是num的总数
四、按年进行数据统计
执行查询语句
SELECT
NAME,SUM(num) AS total_num, DATE_FORMAT(datetime, '%Y') as Year
FROM time_data
GROUP BY NAME, Year
查看结果
可以看到 我们就统计出了每年的数据。我统计的是num的总数
五、扩展
1.每半年数据
表中数据如下
执行查询语句
SELECT NAME, SUM(num) AS total_num, CONCAT(YEAR(datetime), '-', IF(MONTH(datetime) <= 6, '上半年', '下半年')) AS Time_Range
FROM time_data
GROUP BY NAME, Time_Range
查看结果
可以看到 我们就统计出了每半年的数据。我统计的是num的总数
2.每三个月
执行查询语句
SELECT
NAME,
SUM(num) AS total_num,
CONCAT(DATE_FORMAT(datetime, '%Y'), ' ',
CASE
WHEN MONTH(datetime) BETWEEN 1 AND 3 THEN '1-3'
WHEN MONTH(datetime) BETWEEN 4 AND 6 THEN '4-6'
WHEN MONTH(datetime) BETWEEN 7 AND 9 THEN '7-9'
WHEN MONTH(datetime) BETWEEN 10 AND 12 THEN '10-12'
END) AS Time_Range
FROM time_data
GROUP BY NAME, Time_Range
查看结果
可以看到 我们就统计出了每三个月的数据。我统计的是num的总数