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

OData API日期查询报错:如何调整查询覆盖完整自然月?

调整API查询以获取完整自然月通话记录

问题原因

你的代码用timedelta(days=30)计算时间范围时触发API 400错误,根源有两个:

  1. API严格限制查询日期必须在过去30天内,当days=30时,起始时间与当前时间的间隔刚好等于30天,违反了API的限制条件;
  2. 固定30天的跨度无法适配有31天的月份,无法覆盖完整自然月的范围。

解决方案

根据需求选择以下查询方式:

方式1:查询当前自然月至今的记录

计算当月第一天的0点作为起始时间,确保覆盖从月初到现在的所有记录:

from datetime import datetime, timezone

end = datetime.now(timezone.utc)
# 获取当月第一天的UTC时间(00:00:00)
start = end.replace(day=1, hour=0, minute=0, second=0, microsecond=0)

query_parameters = CallRecordsRequestBuilder.CallRecordsRequestBuilderGetQueryParameters(
    filter=" ".join(
        f"""
        participants_v2/any(p:p/id eq '{uuid}')
        and
        startDateTime ge {start.strftime('%Y-%m-%dT%H:%M:%SZ')}
        and
        startDateTime lt {end.strftime('%Y-%m-%dT%H:%M:%SZ')}
    """.split()
    )
)

方式2:查询完整的上一个自然月

如果需要获取上个月的完整记录,以上月第一天0点到当月第一天0点作为时间范围:

from datetime import datetime, timezone, timedelta

end = datetime.now(timezone.utc)
# 获取当月第一天的UTC时间(00:00:00)
current_month_start = end.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
# 计算上月第一天的UTC时间(00:00:00)
last_month_start = (current_month_start - timedelta(days=1)).replace(day=1, hour=0, minute=0, second=0, microsecond=0)

query_parameters = CallRecordsRequestBuilder.CallRecordsRequestBuilderGetQueryParameters(
    filter=" ".join(
        f"""
        participants_v2/any(p:p/id eq '{uuid}')
        and
        startDateTime ge {last_month_start.strftime('%Y-%m-%dT%H:%M:%SZ')}
        and
        startDateTime lt {current_month_start.strftime('%Y-%m-%dT%H:%M:%SZ')}
    """.split()
    )
)

方式3:适配API 30天限制的近30天完整范围

如果API只允许查询过去30天内的数据,可调整为查询过去30天的0点到现在的范围:

from datetime import datetime, timezone, timedelta

end = datetime.now(timezone.utc)
# 取30天前的0点作为起始时间
start = (end - timedelta(days=30)).replace(hour=0, minute=0, second=0, microsecond=0)

query_parameters = CallRecordsRequestBuilder.CallRecordsRequestBuilderGetQueryParameters(
    filter=" ".join(
        f"""
        participants_v2/any(p:p/id eq '{uuid}')
        and
        startDateTime ge {start.strftime('%Y-%m-%dT%H:%M:%SZ')}
        and
        startDateTime lt {end.strftime('%Y-%m-%dT%H:%M:%SZ')}
    """.split()
    )
)

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:40:24