Calculate DATEDIFF in POSTGRES using SQLAlchemy

拜拜、爱过 提交于 2019-12-10 15:07:28

问题


I need to calculate DATEDIFF in minutes between 2 columns of timestamp type. There are so many simple examples on the web, but none of them work really much properly using psycopg2 + sqlalchemy. I've tried:

from sqlalchemy import as sa
from datetime import datetime

# con is a standard pool of connections :class:Connection
con.execute(
    sa.func.datediff(
        sa.literal_column('minute'),
        datetime.utcnow(),
        datetime.utcnow(),
    )
)

it throws:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "minute" does not exist
LINE 1: SELECT datediff(minute, '2017-02-27T15:04:33.217559'::timest...
                    ^
[SQL: 'SELECT datediff(minute, %(datediff_2)s, %(datediff_3)s) AS datediff_1'] [parameters: {'datediff_3': datetime.datetime(2017, 2, 27, 15, 4, 33, 217596), 'datediff_2': datetime.datetime(2017, 2, 27, 15, 4, 33, 217559)}]

if I try:

con.execute(
    sa.func.datediff(
        'minute',
        datetime.utcnow(),
        datetime.utcnow(),
    )
)

I receive:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function datediff(unknown, timestamp without time zone, timestamp without time zone) does not exist
LINE 1: SELECT datediff('minute', '2017-02-27T12:27:49.369724'::time...
           ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
[SQL: 'SELECT datediff(%(datediff_2)s, %(datediff_3)s, %(datediff_4)s) AS datediff_1'] [parameters: {'datediff_4': datetime.datetime(2017, 2, 27, 12, 27, 49, 369740), 'datediff_2': 'minute', 'datediff_3': datetime.datetime(2017, 2, 27, 12, 27, 49, 369724)}]

Any ideas how to make it right?


回答1:


PostgreSQL does not have a datediff function. To get the number of minutes, use the SQL expression:

trunc((extract(epoch FROM newer_date) - extract(epoch FROM older_date)) / 60)
  • extract(epoch FROM …) converts the timestamp to number of seconds.
  • / 60 converts to seconds to minutes
  • trunc(…) removes the fractional part.

So probably try

sa.func.trunc((
    sa.extract('epoch', datetime.utcnow()) -
    sa.extract('epoch', datetime.utcnow())
) / 60)


来源:https://stackoverflow.com/questions/42485952/calculate-datediff-in-postgres-using-sqlalchemy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!