我有记录first_action和last_action日期时间列的UserSession模型, 我想知道用户在应用程序中花了多长时间 - 这是两者之间差异的总和(忽略Null last_action的那些)。
不幸的是,django ORM聚合函数只能在单个列上工作,所以为了提高效率(每个用户可以有数千个会话)我用原始SQL编写它,但是因为我得到了一些高数字我比较了一个python和。我不知道为什么,但这两个计算结果没有相同,你能帮我解决一下吗?
的Python:
sum(((us.last_action - us.first_action) for us in UserSession.objects.filter(user_id=1234) if us.last_action), datetime.timedelta(0))
SQL:
select sum(last_action - first_action) as total_time from usersession where user_id = 1234 and last_action is not null;
答案 0 :(得分:1)
我发现了问题 - 我不知道在mysql中从另一个日期时间减去一个日期时间,但它不是我想要的。
正确的SQL查询是:
select sum(timestampdiff(SECOND, first_action, last_action )) as total_time from usersession where user_id = 123 and last_action is not null
现在sql结果与python结果相同 - 没有将所有会话都拉到内存中。