python - 如何使用 SQLalchemy 过滤日期时间字段 +/- 日期时间

标签 python mysql datetime sqlalchemy

我有一个 mysql 表,表示社论文章及其元数据,如标题、作者和创建日期。

我有另一个表,表示在不同时间点计算的这些文章的指标(例如查看次数)。每行都是特定文章在特定时刻的这些指标的记录。

我想要检索指标表中指标行时间戳字段位于相关文章的 datecreated 字段过去一小时后两小时内的所有行。我想使用 SQLalchemy 来完成此操作。

我当前的 SQLalchemy 查询如下所示:

import sqlalchemy as sa
import models as m

s = session()
q = (s.query(m.Article.fb_shares, func.avg(m.ArticlesMetric.views)),
 .join(m.ArticlesMetric)
 .filter(sa.between(m.ArticlesMetric.tstamp,
         m.Article.created + timedelta(hours=1),
         m.Article.created + timedelta(hours=3))
        )
 .group_by(m.Article.id))

result = q.all()
s.close()

但是,这会导致以下错误:

Warning: (1292, u"Truncated incorrect DOUBLE value: '1970-01-01 05:30:00'")

当尝试在不同类型之间进行比较时,mySQL 在进行比较之前会在内部将不同类型的数据转换为 double 。我相信这个错误在某种程度上是使用 timedelta 的结果,但我不确定我还能如何实现我想要做的事情。非常欢迎任何建议。

最佳答案

事实上,这比看起来更难。如果您直接在 MySQL 中完成此操作,那么您将编写以下内容:

SELECT ...
FROM ...
JOIN ...
WHERE tstamp BETWEEN DATE_ADD(created, INTERVAL 1 HOUR) AND DATE_ADD(created, INTERVAL 3 HOUR)
GROUP BY ...

您必须使用 SQLAlchemy 做或多或少相同的事情,只是因为 m.Article.created 不是一个常量。

如果启用查询日志记录,您可以看到代码生成的 MySQL 查询,并发现它与您想象的不符:

INFO:sqlalchemy.engine.base.Engine:SELECT test.id AS test_id, test.dt AS test_dt, test.tp AS test_tp 
FROM test 
WHERE test.tp BETWEEN test.dt + %(dt_1)s AND test.dt + %(dt_2)s
INFO:sqlalchemy.engine.base.Engine:{'dt_1': datetime.datetime(1970, 1, 1, 1, 0), 'dt_2': datetime.datetime(1970, 1, 1, 3, 0)}

我设法找到一种方法来做你想做的事,这是代码:

from sqlalchemy.sql import func
from sqlalchemy.sql.expression import text

...
filter(sa.between(m.ArticlesMetric.tstamp,
     func.date_add(m.Article.created, text('INTERVAL 1 HOUR')),
     func.date_add(m.Article.created, text('INTERVAL 3 HOUR')))

关于python - 如何使用 SQLalchemy 过滤日期时间字段 +/- 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983887/

相关文章:

MySQL比较和 '%'

php - 无法将电子邮件插入 wordpress 数据库

bash - Bash 中的组合日期和时间表示

php - 将字符串解析为 DateTime 时出错

python - 递归重命名文件和文件夹

python - 使用 Pandas 将三个或更多数据帧合并为单个数据帧并保留空值

php - php 人类可读格式的日期

mysql - 滚动 12 个月数据 - SQL

python - matplotlib 将窗口显示为事件窗口

python - Python 中 XML 数据的 For 循环返回预期元素数量的 4 倍