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

Django计算上周日期报错:str与datetime.timedelta减法类型不支持

报错原因

触发unsupported operand type(s) for -: 'str' and 'datetime.timedelta'错误的核心原因是:通过request.GET.get()获取的请求参数默认是字符串类型,你打印看到的2022-06-06本质是str值,不是datetime.date类型对象,无法直接和timedelta类型做日期加减运算。

修复方案
  • 先把拿到的日期字符串按照年-月-日的固定格式,解析为date类型对象,再执行时间偏移计算
  • 执行SQL时根据数据库字段的实际类型(字符串/日期类型)传入对应格式的值,避免参数类型不匹配
  • 可额外增加参数非空判断、日期格式异常捕获逻辑,避免非法参数导致接口抛出500错误
修复后完整代码
from datetime import datetime, timedelta, date
from django.db import connection

def report(request):
    # 读取原始字符串格式的请求参数
    start_date_str = request.GET.get('start_date')
    end_date_str = request.GET.get('end_date')

    # 将字符串解析为date对象,匹配传入参数的%Y-%m-%d格式
    start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date()
    end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date()

    # date类型对象可正常与timedelta做日期运算
    last_week_start_date = start_date - timedelta(days=7)
    last_week_end_date = last_week_start_date + timedelta(days=6)

    d_report = connection.cursor()
    # 若数据库存储的是字符串格式日期,传入原始字符串即可;若为date/datetime类型字段可直接传入解析后的date对象
    d_report.execute(
        '''select * from table where start_date=%s and end_date=%s''',
        [start_date_str, end_date_str]
    )
    # 需要用上一周日期查询时,可按需将last_week_start_date、last_week_end_date转成对应格式传入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:24:15