按自然日统计与指定日期范围重叠条目数的技术实现问询
按自然日统计与指定日期范围重叠条目数的技术实现方案
嘿,我来帮你搞定这个按天统计重叠条目数的需求!咱们先把问题拆解清楚:给定一批带起止时间的条目,再指定一个日期范围,我们要算出这个范围内每一天有多少个条目和当天存在时间重叠。
先明确咱们的输入数据和目标范围:
数据库数据(示例)
[ { "params": { "name": "name1", "start_time": "2022-02-18 00:11:11", "end_time": "2022-02-20 00:11:11", "file": "1" } }, { "params": { "name": "name2", "start_time": "2022-02-15 00:11:11", "end_time": "2022-02-17 00:11:11", "file": "2" } }, { "params": { "name": "name3", "start_time": "2022-02-15 00:00:00", "end_time": "2022-02-20 00:11:11", "file": "3" } } ]
指定的输入日期范围
- 开始日期:
2022-02-16 - 结束日期:
2022-02-18
核心逻辑:判断时间重叠
要确定一个条目是否和某一天重叠,关键是看两个时间区间有没有交集。对于某一天(比如2022-02-16),它的时间区间可以看作是2022-02-16 00:00:00到2022-02-17 00:00:00(用次日零点来简化计算,避免处理23:59:59的边界问题)。
重叠的判断条件是:
条目的
start_time<= 当天区间的结束时间 并且 条目的end_time>= 当天区间的开始时间
举个例子:file2的结束时间是2022-02-17 00:11:11,它和2022-02-17的区间(到18号零点)有重叠,所以会被算入17号的统计。
具体实现(Python示例)
我用Python写了一段代码来实现这个逻辑,用到datetime模块处理日期时间,逻辑清晰易懂:
from datetime import datetime, timedelta # 示例数据库数据 db_data = [ {"params": {"name": "name1", "start_time": "2022-02-18 00:11:11", "end_time": "2022-02-20 00:11:11", "file": "1"}}, {"params": {"name": "name2", "start_time": "2022-02-15 00:11:11", "end_time": "2022-02-17 00:11:11", "file": "2"}}, {"params": {"name": "name3", "start_time": "2022-02-15 00:00:00", "end_time": "2022-02-20 00:11:11", "file": "3"}} ] # 输入日期范围转换为datetime对象 input_start = datetime.strptime("2022-02-16", "%Y-%m-%d") input_end = datetime.strptime("2022-02-18", "%Y-%m-%d") # 生成日期范围内的所有自然日列表 current_date = input_start date_list = [] while current_date <= input_end: date_list.append(current_date) current_date += timedelta(days=1) # 统计每天的重叠条目数 daily_count = {} for date in date_list: day_start = date day_end = date + timedelta(days=1) count = 0 for item in db_data: # 转换条目的起止时间为datetime对象 item_start = datetime.strptime(item["params"]["start_time"], "%Y-%m-%d %H:%M:%S") item_end = datetime.strptime(item["params"]["end_time"], "%Y-%m-%d %H:%M:%S") # 判断两个区间是否重叠 if item_start < day_end and item_end > day_start: count += 1 daily_count[date.strftime("%Y-%m-%d")] = count # 输出统计结果 print("按天统计的重叠条目数:") for day, cnt in daily_count.items(): print(f"{day}: {cnt} 个")
运行结果
这段代码运行后会输出:
按天统计的重叠条目数: 2022-02-16: 2 个 2022-02-17: 2 个 2022-02-18: 2 个
这个结果完全符合时间重叠的实际逻辑:
- 2022-02-16:file2、file3 都和当天重叠
- 2022-02-17:file2、file3 都和当天重叠
- 2022-02-18:file1、file3 都和当天重叠
备注:内容来源于stack exchange,提问作者Toan Nguyen
相关产品推荐
相关产品推荐

