Python 红移:DateDiff调用时发生SqlAlchemy错误

Python 红移:DateDiff调用时发生SqlAlchemy错误,python,postgresql,sqlalchemy,amazon-redshift,Python,Postgresql,Sqlalchemy,Amazon Redshift,我在一次红移DATEDIFF呼叫中不断收到一个错误。当连接到同一个红移服务器时,我成功地使用了SQL Workbench。不幸的是,我并没有使用SQLAlchemy这么热门,我希望在这里能得到一些帮助。如果你需要更多的细节,请告诉我 使用MyTable的类定义 class MyTable(Base): __tablename__ = 'my_table' __table_args__ = { 'schema': 'elm' } tstamp =

我在一次红移
DATEDIFF
呼叫中不断收到一个错误。当连接到同一个红移服务器时,我成功地使用了SQL Workbench。不幸的是,我并没有使用SQLAlchemy这么热门,我希望在这里能得到一些帮助。如果你需要更多的细节,请告诉我


使用
MyTable
的类定义

class MyTable(Base):
    __tablename__ = 'my_table'
    __table_args__ = {
        'schema': 'elm'
    }
    tstamp = Column(TIMESTAMP(timezone=True), nullable=False)
我试图在我的表中查找tstamp的最后12个小时,其中值比最新tstamp值早12个小时。(
datediff(小时,最大(tstamp),tstamp)>12

然而,我不断地发现这个错误:

sqlalchemy.exc.ProgrammingError: 
(psycopg2.ProgrammingError) 
function pg_catalog.date_diff("unknown", timestamp with time zone, timestamp with time zone) does not exist
HINT:  No function matches the given name and argument types. 
You may need to add explicit type casts.
下面是我打印到控制台时SQL的样子。对
Redshift
服务器使用
sqlworkbench
,可以得到预期的结果

[SQL: '
    SELECT elm.my_table.tstamp AS elm_my_table_tstamp 
    FROM elm.my_table
    WHERE elm.my_table.tstamp IN (
        SELECT DISTINCT elm.my_table.tstamp, 
        datediff(%(datediff_1)s, %(datediff_2)s, elm.my_table.tstamp) AS z 
        FROM elm.my_table 
        WHERE datediff(%(datediff_1)s, %(datediff_2)s, elm.my_table.tstamp) >= %(param_1)s)
'] 
[
    parameters: {
    'datediff_2': datetime.datetime(2016, 11, 2, 19, 15, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 
    'param_1': 12, 
    'datediff_1': 'hour'
    }
]

进口:

from my_package import MyTable
from sqlalchemy import select, func, distinct, extract, text

结果:

max = session.execute(select([func.max(MyTable.tstamp)])).first()[0]
session.execute(MyTable.__table__.delete().where(
    MyTable.tstamp.in_(
        select([distinct(MyTable.tstamp)]).where(
            func.datediff('hour',
                          cast(MyTable.tstamp, TIMESTAMP(timezone=False)),
                          cast(max, TIMESTAMP(timezone=False)))
            >= 12
        )
    )
))
(我想删除找到的行)

不支持
timestamptz
类型。
timestamtz
类型是红移的最新添加。您需要将其转换为
时间戳
,例如(未测试)


酷,所以
CAST(tstamp,TIMESTAMP(timezone=False))
消除了错误,但我仍然没有得到结果+我需要帮助,但我还是要解决问题problem@J.D.我认为您正在反向使用
DATEDIFF
DATEDIFF(…,a,b)
提供了
b-a
,而不是
a-b
。你完全正确。2/2. 我能给你两张票吗?
max = session.execute(select([func.max(MyTable.tstamp)])).first()[0]
session.execute(MyTable.__table__.delete().where(
    MyTable.tstamp.in_(
        select([distinct(MyTable.tstamp)]).where(
            func.datediff('hour',
                          cast(MyTable.tstamp, TIMESTAMP(timezone=False)),
                          cast(max, TIMESTAMP(timezone=False)))
            >= 12
        )
    )
))
func.datediff("max", max.replace(tzinfo=None), cast(MyTable.tstamp, TIMESTAMP(timezone=False)))