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分钟递增的时间序列
-
变量初始化:
- 通过子查询中的
@date := ...
来初始化@date
变量。这部分代码将'2024-02-01'
的时间部分设置为每半小时段的开始时间(即00或30分钟),然后减去30分钟以便在首次迭代时回到期望的起始时间。
- 通过子查询中的
-
中间层子查询 (
days
):- 这里使用了表
sys_login
作为数据源,但实际上并没有利用该表的数据,只是借用它来创建足够多的行数以生成多个时间点。用于没有直接方法生成指定数量的行。
- 这里使用了表
-
外部查询:
- 外部查询通过对内部子查询结果进行操作,每次迭代都通过
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来近似到最接近的半小时段。