如何从TimeKey生成15分钟间隔编号与间隔名称
实现15分钟时间间隔编号与名称的推导方法
核心推导逻辑
1. 15分钟间隔编号计算
将TimeKey转换为当天的总分钟数(小时×60 + 分钟),通过以下公式得到编号:间隔编号 = (总分钟数 // 15) + 1
- 原理:每15分钟为一个区间,从0分钟开始计数,第0个区间对应编号1,以此类推,23:59所在的第95个区间对应编号96。
- 验证示例:
- 00:00:00 → 总分钟数0 → 0//15=0 → 0+1=1
- 01:15:00 → 总分钟数75 →75//15=5 →5+1=6
- 23:59:59 → 总分钟数1439 →1439//15=95 →95+1=96
2. 15分钟间隔名称计算
- 确定当前区间的起始分钟:
起始分钟 = (总分钟数 //15) ×15 - 计算结束分钟:
结束分钟 = 起始分钟 +14,若结果超过1439(即23:59)则取1439 - 将起始分钟、结束分钟分别格式化为
HH:MM格式,拼接为起始时间-结束时间的形式
- 验证示例:
- 04:30:00 → 起始分钟270 → 04:30,结束分钟284 →04:44 → 04:30-04:44
- 23:59:59 → 起始分钟1425 →23:45,结束分钟1439 →23:59 →23:45-23:59
代码实现示例
Python 实现
def get_15min_interval(time_str): # 拆分时间为时分秒 hh, mm, ss = map(int, time_str.split(':')) total_min = hh * 60 + mm # 计算间隔编号 interval_num = (total_min // 15) + 1 # 计算起始和结束分钟 start_min = (total_min // 15) * 15 end_min = min(start_min + 14, 1439) # 限制最大分钟数为1439(23:59) # 格式化为HH:MM start_hh, start_mm = divmod(start_min, 60) end_hh, end_mm = divmod(end_min, 60) interval_name = f"{start_hh:02d}:{start_mm:02d}-{end_hh:02d}:{end_mm:02d}" return interval_num, interval_name # 测试示例数据 test_times = [("00:00:00", 1, "00:00-00:14"), ("01:15:00", 6, "01:15-01:29"), ("04:30:00", 19, "04:30-04:44"), ("05:15:00", 22, "05:15-05:29")] for time, expected_num, expected_name in test_times: num, name = get_15min_interval(time) assert num == expected_num and name == expected_name, f"测试失败:{time}" print("所有测试通过")
SQL 实现(MySQL)
假设数据表time_data包含ID和TimeKey字段(TimeKey为字符串类型,若为时间类型可去掉STR_TO_DATE函数):
SELECT ID, TimeKey, -- 计算间隔编号 FLOOR((HOUR(STR_TO_DATE(TimeKey, '%H:%i:%s'))*60 + MINUTE(STR_TO_DATE(TimeKey, '%H:%i:%s'))) / 15) + 1 AS `15分钟间隔编号`, -- 计算间隔名称 CONCAT( DATE_FORMAT( MAKETIME( FLOOR((HOUR(STR_TO_DATE(TimeKey, '%H:%i:%s'))*60 + MINUTE(STR_TO_DATE(TimeKey, '%H:%i:%s')))/15)*15 DIV 60, FLOOR((HOUR(STR_TO_DATE(TimeKey, '%H:%i:%s'))*60 + MINUTE(STR_TO_DATE(TimeKey, '%H:%i:%s')))/15)*15 MOD 60, 0 ), '%H:%i' ), '-', DATE_FORMAT( MAKETIME( (FLOOR((HOUR(STR_TO_DATE(TimeKey, '%H:%i:%s'))*60 + MINUTE(STR_TO_DATE(TimeKey, '%H:%i:%s')))/15)*15 + 14) DIV 60, (FLOOR((HOUR(STR_TO_DATE(TimeKey, '%H:%i:%s'))*60 + MINUTE(STR_TO_DATE(TimeKey, '%H:%i:%s')))/15)*15 + 14) MOD 60, 59 ), '%H:%i' ) ) AS `15分钟间隔名称` FROM time_data;
内容的提问来源于stack exchange,提问作者StevePat
相关产品推荐
相关产品推荐

