【问题标题】:Using parameter with interval in query在查询中使用带间隔的参数
【发布时间】:2017-08-04 14:39:55
【问题描述】:

我有这个查询,默认情况下,获取过去 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 分钟前的所有数据。

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

【问题讨论】:

    标签: python sql postgresql intervals psycopg2


    【解决方案1】:

    现在你有一个开放范围

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

    你需要关闭上限

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

    请务必确认您是否需要 &gt;= &lt;= 来包含边界案例

    【讨论】:

    • 当我尝试这些时,它给了我IndexError: tuple out of range。不知道为什么
    • 我只是在谈论查询,您需要关闭范围。我不熟悉 python sintaxis,但也许你需要在最后添加两个参数。 , (newTime, newTime) 之类的东西,因为现在你有另一个参数?
    • 你应该尝试的其他事情是 A) 检查你在newTime 中有什么值 B) 那个索引错误很奇怪 测试你的查询带有时间硬编码WHERE tstampz &gt; 2017-08-01 12:00:00 AND tstampz &lt; 2017-08-01 13:00:00
    • 我已经能够打印出newTime 的任何值,它们是正确的并且格式正确。此外,按照您的建议添加第二个参数修复了我的索引错误。但是,它没有显示正确的数据,并且不再显示当前时间的正确数据
    • 能否先在postgresql中直接测试查询?你能写出你正在寻找的确切范围吗?对于我对您的问题的理解,范围应该可以解决问题。除非你错过了边境案件。
    【解决方案2】:

    您需要一个闭区间,并且不要强制转换为 date。如有必要,根据tstampz 数据类型转换为timestamptimestamptz

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多