如何在SQLite + SQLalchemy中减去日期时间?

时间:2013-08-08 15:14:35

标签: sqlite datetime sqlalchemy

我正在使用sqlite + sqlalchemy而我正在做this而且我得到了一些看起来像这样的SQL:

SELECT task.id as task_id, task.title AS task_title
FROM task
WHERE (SELECT sum(coalesce(intervals."end", CURRENT_TIMESTAMP) - intervals.start) AS sum_1
FROM intervals
WHERE task.id = intervals.task_id) > :param_1

问题是这不起作用,因为我的查询实际上需要如下所示:

...
WHERE (SELECT sum(julianday(coalesce(intervals."end", CURRENT_TIMESTAMP)) - julianday(intervals.start)) AS sum_1
...

但是我无法在SQLAlchemy中找到julianday函数,或者确切地知道如何手动修改查询。

如何改变行为,以便我可以在sqlite中实际获得这些值的差异?

1 个答案:

答案 0 :(得分:1)

SQLAlchemy无需明确定义每个数据库引擎中的每个函数。它知道一些标准的,但您可以使用sqlalchemy.func.foobar(arg1, arg2, ...),它将被转换为SQL中的函数调用foobar(arg1, arg2, ...)。变化

@time_spent.expression
def time_spent(cls):
    return func.coalesce(cls.end, func.current_timestamp()) - cls.start

@time_spent.expression
def time_spent(cls):
    return func.julianday(func.coalesce(cls.end, func.current_timestamp())) - \
           func.julianday(cls.start)

你应该没事。坚持使用SQLite,因为julianday不可移植。