2013-08-08 1 views
1

나는 sqlite가 + SQLAlchemy의를 사용하고 있는데 나는 this을하고 그리고 난은 다음과 같습니다 일부 SQL을 얻을 :어떻게 SQLite + SQLalchemy에서 datetimes 빼기?

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 
... 

하지만 난 JULIANDAY의 SQLAlchemy의 함수, 또는 정확히 어떻게 쿼리를 손으로 변경하는 방법을 찾을 수 없어.

어떻게 sqlite에서 실제로 이러한 값의 차이를 얻을 수 있도록 동작을 변경할 수 있습니까?

답변

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) 

에 변경 당신도 잘해야합니다. 그러나 julianday은 이식 가능하지 않기 때문에 SQLite로 고정됩니다.

+0

아! 완벽 함 - 내가 실제로 '합치다'를 'coalesc'로 잘못 입력했을 때 나는 이것에 노출되었다. 그러나 나는 그것을 내 마음에서 완전히 꺼냈다. –

관련 문제