【问题标题】:Calculate DATEDIFF in POSTGRES using SQLAlchemy使用 SQLAlchemy 在 POSTGRES 中计算 DATEDIFF
【发布时间】:2017-07-18 01:52:43
【问题描述】:

我需要在 timestamp 类型的 2 列之间以分钟为单位计算 DATEDIFF。 网上有很多简单的例子,但没有一个使用 psycopg2 + sqlalchemy 能很好地工作。 我试过了:

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(),
    )
)

它抛出:

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)}]

如果我尝试:

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

我收到:

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)}]

任何想法如何使它正确?

【问题讨论】:

    标签: python postgresql sqlalchemy psycopg2


    【解决方案1】:

    PostgreSQL does not have a datediff function。获取分钟数,use the SQL expression:

    trunc((extract(epoch FROM newer_date) - extract(epoch FROM older_date)) / 60)
    
    • extract(epoch FROM …) 将时间戳转换为秒数。
    • / 60 转换为秒到分钟
    • trunc(…) 删除小数部分。

    所以可能会尝试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      相关资源
      最近更新 更多