我有这个查询,默认情况下,获取过去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分钟前的所有数据。
如何使查询与我正在寻找的时间间隔兼容?
答案 0 :(得分:1)
现在你有一个开放范围
WHERE tstampz > (%s::date - INTERVAL '60 mins')
您需要关闭上限
WHERE tstampz > (%s::date - INTERVAL '60 mins')
AND tstampz < %s::date
请务必验证是否需要>= <=
包含边框案例
答案 1 :(得分:0)
您需要一个关闭的间隔,不要强制转换为date
。如有必要,根据timestamp
数据类型转换为timestamptz
或tstampz
:
cur.execute("""
SELECT count(DISTINCT(username))
from user_table
WHERE
tstampz > %s::timestamptz - INTERVAL '60 mins'
and
tstampz < %s::timestamptz
""", (newTime, newTime))