Django - datetime列之间的差异总和

时间:2011-09-18 15:56:01

标签: sql django orm aggregate-functions

我有记录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;

1 个答案:

答案 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结果相同 - 没有将所有会话都拉到内存中。