sqlalchemy仅按日期列选择x新设日

时间:2015-06-11 10:02:43

标签: sql select sqlalchemy

假设我有一个表MyTable,其中包含some_date列(当然是日期类型),我想选择最新的3个月数据(或x天)。 实现这一目标的最佳方法是什么?

请注意,日期不应该从今天开始计算,而应该从表格中的日期范围开始计算(可能比今天更早)

我需要找到最大日期并将其与每行进行比较 - 如果差异小于x天,则返回它。

所有这一切都应该使用sqlalchemy并且不加载整个表。 这样做的最佳方式是什么?我必须有子查询才能找到最大日期吗?如何选择最近X天?

感谢任何帮助。

修改 以下查询在Oracle中有效,但似乎效率低下(每行最多计算一次?)而且我不认为它适用于所有方言:

select * from my_table where (select max(some_date) from my_table) - some_date < 10

2 个答案:

答案 0 :(得分:0)

我最终做了两个选择 - 一个用于获取最大日期,另一个用于获取数据

使用this thread中的datediff配方我添加了一个约会函数并使用查询q = session.query(MyTable).filter(datediff(max_date, some_date) < 10)

我仍然不认为这是最好的方式,但直到有人证明我错了,它必须做...

答案 1 :(得分:0)

您可以在单个查询中执行此操作,而无需创建datediff

以下是我过去一天获取所有内容的示例:

    one_day = timedelta(hours=24)
    one_day_ago = datetime.now() - one_day
    Message.query.filter(Message.created > one_day_ago).all()

您可以将timedelta调整到您感兴趣的任何时间范围。

<强>更新

重新阅读您的问题后,我似乎没有考虑到您要比较数据库中的两个日期而不是今天的日期。我很确定这种行为将特定于数据库。在Postgres中,您可以使用straightforward arithmetic.

Operations with DATEs
1. The difference between two DATES is always an INTEGER, representing the number of DAYS difference
DATE '1999-12-30' - DATE '1999-12-11' = INTEGER 19
You may add or subtract an INTEGER to a DATE to produce another DATE
DATE '1999-12-11' + INTEGER 19 = DATE '1999-12-30'

如果您在postgres中存储日期,则可能正在使用时间戳。使用时间戳进行数学运算会产生间隔对象。 Sqlalachemy使用timedeltas作为间隔的表示。所以你可以这样做:

one_day = timedelta(hours=24)
Model.query.join(ModelB, Model.created - ModelB.created < interval)

我还没有完全测试过这个,但是我已经完成了这样的事情并且已经有效了。