【问题标题】:SQLite3 Query in Python to Retrieve count of rows between two DatesPython中的SQLite3查询以检索两个日期之间的行数
【发布时间】:2022-01-14 17:10:45
【问题描述】:

问题

我有一个带有两个表 bt 和数据的 sqlite3 数据库。 两个表都包含格式为 YYYY-MM-DD 的日期列。 我已经阅读了一张作为熊猫 df 的表格。

我需要遍历 df 中的行并返回该行中日期的 14 天内的行数。

我尝试过的代码

import sqlite3 as lite
import pandas as pd

#Function to Create DB Connection and Raise Error
def create_connection(db_file):
    """ create a database connection to the SQLite database
        specified by db_file
    :param db_file: database file
    :return: Connection object or None
    """
    conn = None
    try:
        conn = lite.connect(db_file)
        return conn
    except lite.Error as e:
        print(e)

    return conn

#Creat Connection to DB and Create df
conn = create_connection('test.db')
df = pd.read_sql("Select * from data;", conn)

#Create Cursor
cur = conn.cursor()

#Iterate over rows in df and return count of rows within date range
for index ,row in df.iterrows():
    cur.execute("SELECT count(*) FROM bt WHERE id='{}' AND datetime(btdate) BETWEEN datetime('{}') AND datetime('{}', '-15 day');".format(row['id'], row['date'], row['date']))
    print(cur.fetchall())

电流输出

上述查询返回全 0,但我知道表中存在满足此条件的行。

[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]
[(0,)]

所需的输出 我想要的输出是两个日期之间的行数。

【问题讨论】:

    标签: python sql pandas sqlite between


    【解决方案1】:

    您的代码的问题是您已将运算符BETWEEN 的起始值和结束值设置为相反的。
    应该是:

    BETWEEN datetime('{}', '-15 day') AND datetime('{}') 
    

    但是,我也建议使用? 占位符来传递参数。
    此外,如果日期已经采用YYYYY-MM-DD 格式,则无需使用datetime()date() 函数来获取日期。

    使用这个:

    sql = "SELECT COUNT(*) FROM bt WHERE id = ? AND btdate BETWEEN date(?, '-15 day') AND ?;"
    cur.execute(sql, (row['id'], row['date'], row['date']))
    

    【讨论】:

    • 使用 和有什么区别?并使用括号?
    • @Redratz ?占位符被认为是 sql 注入安全的。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多