sql语句根据分钟分组查询

select
	t.statime
from
	(
	select
		@date := DATE_ADD(@date, interval 30 minute) `time`
	from
		(
		select
			@date := DATE_ADD(date_format(concat(date('2024-02-01'), ' ', hour('2024-02-01'), ':', floor(minute('2024-02-01') / 30) * 30), '%Y-%m-%d %H:%i:00'), interval -30 minute)
        from sys_login) days) t

该sql语句生成一个从 2024-02-01 开始,每隔30分钟递增的时间序列

  1. 变量初始化:

    • 通过子查询中的@date := ...来初始化@date变量。这部分代码将'2024-02-01'的时间部分设置为每半小时段的开始时间(即00或30分钟),然后减去30分钟以便在首次迭代时回到期望的起始时间。
  2. 中间层子查询 (days):

    • 这里使用了表sys_login作为数据源,但实际上并没有利用该表的数据,只是借用它来创建足够多的行数以生成多个时间点。用于没有直接方法生成指定数量的行。
  3. 外部查询:

    • 外部查询通过对内部子查询结果进行操作,每次迭代都通过DATE_ADD(@date, INTERVAL 30 MINUTE)增加@date变量30分钟,并将其值赋予time字段。

根据实际情况 可以进行调整

SET @date = DATE_ADD(DATE_FORMAT('2024-02-01 00:00:00', '%Y-%m-%d %H:%i:00'), INTERVAL -30 MINUTE);

SELECT t.statime
FROM (
    SELECT 
        @date := DATE_ADD(@date, INTERVAL 30 MINUTE) AS statime
    FROM 
        (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
         -- 根据需要扩展此部分,每个SELECT代表一行,决定生成多少个时间点
         -- 例如,如果想要生成一天的时间点,需要48个UNION ALL(因为一天有24小时,每半小时一个点)
        ) AS temp
) AS t;
SET @start_time = '2024-02-01 00:00:00';

SELECT 
    @start_time := DATE_ADD(@start_time, INTERVAL 30 MINUTE) AS statime
FROM 
    (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ... /* 根据需要添加更多UNION ALL*/) AS numbers;

如果是根据数据来进行分钟分组 可以直接使用

date_format(concat(date(cTime), ' ', hour(cTime), ':', floor(minute(cTime) / 30) * 30), '%Y-%m-%d %H:%i:00') as `time`
SELECT DATE_FORMAT(
    CONCAT(
        DATE(cTime), ' ', 
        HOUR(cTime), ':',
        IF(MINUTE(cTime) < 30, '00', '30')
    ), '%Y-%m-%d %H:%i:00'
) AS `time`

concat函数直接连接了日期和小时部分,但分钟部分通过除以30然后乘以30来近似到最接近的半小时段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值