在查询

时间:2017-08-04 14:39:56

标签: python sql postgresql intervals psycopg2

我有这个查询,默认情况下,获取过去60分钟内的所有数据(从当前时间开始)。但是,用户还可以选择时间(因此参数newTime)。我想在选定时间的过去一小时内获取所有过去的数据。

@app.route('/_ajax', methods=['GET', 'POST'])
def userCount():
    try:
        newTime = request.form['time']
    except:
        newTime = datetime.now()
    cur.execute("""SELECT count(DISTINCT(username)) from user_table WHERE tstampz >
                   (%s::date - INTERVAL '60 mins')""", (newTime,))
    count=cur.fetchone()[0]

这适用于当前时间,但是当我更改时间选择时,它会显示从60分钟前一直到所选日期的数据汇总。

我想要的是什么:如果我选择8月1日下午2点,我希望所有数据都来自8月1日下午1点到2点。

我得到了什么: 8月1日下午2点到60分钟前的所有数据。

如何使查询与我正在寻找的时间间隔兼容?

2 个答案:

答案 0 :(得分:1)

现在你有一个开放范围

  WHERE tstampz > (%s::date - INTERVAL '60 mins')

您需要关闭上限

  WHERE tstampz >  (%s::date - INTERVAL '60 mins')
    AND tstampz <  %s::date

请务必验证是否需要>= <=包含边框案例

答案 1 :(得分:0)

您需要一个关闭的间隔,不要强制转换为date。如有必要,根据timestamp数据类型转换为timestamptztstampz

cur.execute("""
    SELECT count(DISTINCT(username)) 
    from user_table 
    WHERE 
        tstampz > %s::timestamptz - INTERVAL '60 mins'
        and
        tstampz < %s::timestamptz
""", (newTime, newTime))