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

如何用Django ORM计算DateTimeField时长并生成指定结构查询集

Django ORM对应实现

依赖导入

from django.db import models
from django.db.models import F, Func, TruncDate
import csv

核心查询代码

针对MySQL语法定制时间差格式化函数,生成的查询逻辑和你提供的原生SQL完全一致:

# 封装MySQL时间格式化逻辑
class TimeDiffFormat(Func):
    function = 'TIME_FORMAT'
    template = "%(function)s(TIMEDIFF(%(expressions)s), '%%H:%%i:%%s')"
    output_field = models.CharField()

tasks = Task.objects.filter(
    # 对应 [pStartDate, pEndDate) 区间筛选
    end_time__gte=pStartDate,
    end_time__lt=pEndDate
).annotate(
    # 从end_time提取日期部分
    working_date=TruncDate('end_time'),
    # 计算格式化后的时长
    work_hours=TimeDiffFormat(F('end_time'), F('start_time'))
# 仅返回需要的字段,等价于SELECT指定字段
).values('working_date', 'ticket_number', 'order_number', 'work_hours')

CSV导出示例

with open('task_export.csv', 'w', newline='', encoding='utf-8-sig') as csv_file:
    # 定义表头顺序
    headers = ['working_date', 'ticket_number', 'order_number', 'work_hours']
    writer = csv.DictWriter(csv_file, fieldnames=headers)
    writer.writeheader()
    writer.writerows(tasks)

补充说明

  • 若使用Django 3.2以下版本,可将TruncDate('end_time')替换为Extract('end_time', 'date')实现相同的日期提取效果
  • 该写法不会引入额外的Python层计算,所有逻辑均在数据库层面执行,和原生SQL性能一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:06:02