簡體   English   中英

如何使用 SQLalchemy 過濾日期時間字段 +/- 日期時間

[英]How to filter datetime field +/- datetime using 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 在進行比較之前在內部將不同類型的數據轉換為雙精度值。 我相信這個錯誤在某種程度上是使用 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')))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM