我遇到以下问题的问题;这个本身工作正常,但它按秒组合,我想截断秒和逐个分钟。我已经尝试过date_trunc,extract等等,但我没有运气。当引擎是sqlite时,extract('minute')工作正常,但不能用postgresql。
任何可以指出我正确方向的人?
PostgreSQL版本:x86_64-redhat-linux-gnu上的PostgreSQL 8.1.23
Column('id', Integer, primary_key=True),
Column('date', TIMESTAMP),
Column('src', String),
Column('dst', String),
Column('len', String),
Column('sport', String),
Column('dport', String),
Column('method', String),
Column('host', String),
Column('useragent', String),
Column('statusline', String),
Column('location', String),
Column('server', String),
Column('load', String),
now = datetime.datetime.now()
DD = now - datetime.timedelta(minutes=60)
DD = DD.strftime('%Y-%m-%d %H:%M:%S')
query = session.query(HTTP.date,HTTP.statusline, func.count(HTTP.statusline).
label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD)).group_by(HTTP.date, HTTP.statusline).order_by(asc(HTTP.date)).all()
答案 0 :(得分:3)
在执行任何其他操作之前,请考虑升级到当前版本的PostgreSQL 8.1 is long dead and forgotten。
不完全确定符号,但来自@Audrius in the comments的更新应该像这样:
query = session.query(
date_trunc('min', http.date).label('date_minute')
,http.statusline
,func.count(http.statusline).label('count')
).filter(http.statusline.contains(status)
,http.date>=(DD)
).group_by('date_minute'
,http.statusline
).order_by(asc('date_minute')).all()
基本上,在date_trunc('min', http.date)
中使用http.date
代替SELECT
,在GROUP BY
和ORDER BY
中使用别名。
顺便说一句:我发现使用date
作为timestamp
的名称是非常误导的。除此之外,我的建议是从不使用任何基本类型名称作为标识符。导致非常混乱的错误消息和其他难以调试的错误。