python - 以天为单位的日期时间差异的高性能计算

标签 python sql-server django python-2.7 django-1.11

我有一个 Django 模型,其中包含带有日期的唯一记录。我目前正在将记录计入天数范围,例如X 个数字已经过了今天的日期,X 个将在接下来的 10 天内发生,X 个将在接下来的 30 天内发生。 下面的代码是我当前正在使用的代码,它从针对模型的records.objects.all() 查询中提取所有值,然后循环遍历每个对象以计算日期时间增量并增加相关计数器。

for x in records:
    if x.date is None:
        missingValue += 1
    else:
        delta = x.date - date.today()
        if delta.days < 0:
            passed += 1
        if delta.days < 10:
            tenDays += 1
        if delta.days < 30:
            thirtyDays += 1

对于大约 50,000 条记录,这大约需要 5-6 秒,这比我想要的要长,我正在尝试减少这个时间,因为记录数量可能会增加。 问题实际上是围绕日期时间差异的高性能计算以及对结果天数进行分组,就好像通过 Django 查询有更好的方法或其他我找不到的方法,我愿意尝试它。

我已经探索了在原始 SQL 中使用 DateAdd,但它似乎需要我查询数据库的每个日期范围,并且仍然导致我需要循环遍历结果。

最佳答案

使用 SQL 窗口COUNT:

WITH cte AS (
     SELECT *,CASE WHEN DATEDIFF(DAY,GETDATE(),targetdate) <=0  THEN 0
                   WHEN DATEDIFF(DAY,GETDATE(),targetdate) <=10 THEN 10
                   WHEN DATEDIFF(DAY,GETDATE(),targetdate) <=30 THEN 30
                   ELSE 31 END AS grp
     FROM [record]   
     --WHERE targetdate > GETDATE() - 60  -- last 60 days
)
SELECT DISTINCT grp, COUNT(*) OVER(ORDER BY grp) AS running_count
FROM cte;

<强> Rextester Demo

关于python - 以天为单位的日期时间差异的高性能计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46864246/

相关文章:

python - 从 facebook ads api 获取所有事件的事件 - 如何设置过滤器

python - 如何获取 SQL 查询的数量?

mysql - 使用 SQL server openquery 从 MySql Server 中提取数据

sql - 如何编写以下输出的查询?

javascript - 如何在 django 框架中将不同用户的多条推文嵌入到 HTML 中?

python - 为什么我的按钮的命令在我创建按钮时立即执行,而不是在我单击它时执行?

sql - 多语句表值函数与内联表值函数

python - 如何在 Django + Apache + mod_python 中使用 Staticgenerator

Django 登录网址

python - Django:根据预保存信号调整图像大小