根据时间字段,查询指定时间段的数据

本文介绍了如何使用SQL查询对数据进行按小时、天、月、年以及更灵活的时间段(如每三小时、每六小时、每半年、每季度)进行统计。通过CASE语句和DATE_FORMAT函数,可以有效地对datetime字段进行分组和格式化,从而得到所需的时间段统计数据。
摘要由CSDN通过智能技术生成

在日常的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的总数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值