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