如何用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
相关产品推荐
相关产品推荐

