OData API日期查询报错:如何调整查询覆盖完整自然月?
调整API查询以获取完整自然月通话记录
问题原因
你的代码用timedelta(days=30)计算时间范围时触发API 400错误,根源有两个:
- API严格限制查询日期必须在过去30天内,当
days=30时,起始时间与当前时间的间隔刚好等于30天,违反了API的限制条件; - 固定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
相关产品推荐
相关产品推荐

