两个日期之间的SQLite查询问题

时间:2020-10-03 16:32:35

标签: python sqlite

我正在研究一个使用SQlite3数据库的Python项目。

我创建的数据库只有一个名为“ Message”的表,其中包含此类数据:

connexion = sqlite3.connect(BDD)
c = connexion.cursor()
c.execute(f""" CREATE TABLE IF NOT EXISTS {arg}(
    Id INTEGER PRIMARY KEY AUTOINCREMENT,
    Jour_Heure_Reception text, 
    Jour_Heure_Reponse text, 
    Theme text,
    Motif text,
    Risque_incident_client text, 
    Transfert_sans_action text,
    Matricule text, 
    Origine text)""")
connexion.commit()
connexion.close();    

我的目标是在Jour_Heure_Reponse列中的2个日期之间搜索,并按矩阵返回条目数。

为此,我使用以下SQlite查询:

def nbr(arg):
    "requette dans la bdd de statistiques mails retournant le nombre de messages par utilisateur sur la période arg"
    #Création de la liste des utilisateurs ayant saisies des entrées dans la BDD sur la période 
    connexion = sqlite3.connect(BDD)
    c = connexion.cursor()    
    date_selection = str((datetime.now() - timedelta(arg)).strftime('%d/%m/%Y'))
    yesterday = str(datetime.now().strftime('%d/%m/%Y'))
    c.execute(f"""
          select Matricule from Message Where 
          Jour_Heure_Reception >= "{date_selection}" 
          and Jour_Heure_Reponse < "{yesterday}" """  )
    agents = c.fetchall() 
    liste_agents = []
    for i in agents:
        if not i[0] in liste_agents:
            liste_agents.append(i[0])
    c.close()
    # calcul du nombre d'entrées pour chaque matricules présent dans la liste crée précédemment
    connexion = sqlite3.connect(BDD)
    c = connexion.cursor()    
    liste_affichage = [] 
    for i in liste_agents:
        c.execute(f"""SELECT * FROM Message where 
              Matricule = "{i}" and 
              Jour_Heure_Reception >= "{date_selection}" and 
              Jour_Heure_Reponse < "{yesterday}" """)
        test = c.fetchall()        
        print(i)
        for i in test:
            print(i[1])
        data_list = [str(i),str(len(test))]
        liste_affichage.append(data_list)    
    c.close()

问题是那个:

当我调用mi nbr func时,如果mi arg不为1,则不返回任何内容,即使有1 arg,结果也不合逻辑。

例如,调用nrb(1),返回此值(我仅打印日期):

02/06/2020
02/06/2020
02/06/2020
02/06/2020
02/06/2020
02/06/2020
02/06/2020
03/06/2020
03/06/2020
03/06/2020
03/06/2020
02/07/2020
02/07/2020
02/07/2020
03/07/2020
03/08/2020
02/09/2020
03/09/2020
03/09/2020
09/08/2020
09/08/2020
09/08/2020
09/08/2020
09/08/2020
01/10/2020
02/10/2020
02/10/2020

如您所见,timedelta没有得到遵守。

由于数据类型存储为文本,因此我在time.strftime()转换后将日期作为str发送。

我要去哪里错了?

1 个答案:

答案 0 :(得分:0)

Sqlite没有专用的日期类型。它支持使用ISO-8601格式的文本字段存储日期。您将必须进行日期格式转换,以便可以执行比较。有关格式的详细信息和文档,请参见: https://www.sqlite.org/lang_datefunc.html

您应使用%Y-%m-%d作为格式字符串。