You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按自然日统计与指定日期范围重叠条目数的技术实现问询

按自然日统计与指定日期范围重叠条目数的技术实现方案

嘿,我来帮你搞定这个按天统计重叠条目数的需求!咱们先把问题拆解清楚:给定一批带起止时间的条目,再指定一个日期范围,我们要算出这个范围内每一天有多少个条目和当天存在时间重叠。

先明确咱们的输入数据和目标范围:

数据库数据(示例)

[
    {
        "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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:08:00