132 votes

Comparaison SQLite DateTime

Je ne parviens pas à obtenir des résultats fiables de la requête contre une base de données sqlite en utilisant une chaîne de date comme comparaison :

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

comment dois-je gérer les comparaisons de dates avec sqlite ?

mise à jour : le champ mydate est un datatype DateTime

Solution :

en utilisant la fonction datetime et en ayant un format de chaîne de caractères comme YYYY-MM-DD HH:mm:ss j'ai obtenu de bons résultats comme suit

select * 
  from table_1 
  where mydate >= Datetime('2009-11-13 00:00:00') 
  and mydate <= Datetime('2009-11-15 00:00:00')

1 votes

Quel est le format de date de la valeur stockée dans votre mydate colonne ? Je suppose qu'il ne s'agit pas d'un des formats supportés par SQLite : sqlite.org/lang_datefunc.html

1 votes

OMG, il s'agit d'un type de données de type datetime

4 votes

Cette utilisation de datetime() donnera la valeur exacte que vous lui avez donnée, il n'y a aucune raison de l'utiliser ici : utilisez simplement la chaîne de caractères à la place. Et si vous ne traitez que des dates, vous devriez supprimer la partie "zero time" - en fait, assurez-vous que les deux côtés sont dans le même format. (Autrement '2009-11-13' pour ma date, sera inférieure à '2009-11-13 00:00:00' .)

107voto

Mark Smith Points 491

Pour résoudre ce problème, je stocke les dates comme YYYYMMDD . Ainsi, where mydate >= '20090101' and mydate <= '20050505'

Cela fonctionne tout simplement tout le temps. Il se peut que vous n'ayez qu'à écrire un analyseur syntaxique pour gérer la façon dont les utilisateurs saisissent leurs dates afin de pouvoir les convertir en YYYYMMDD .

3 votes

Si le format est normalisé, en quoi le format AAAA-MM-JJ serait-il différent de l'absence de tirets ? Les comparaisons ne seraient-elles pas les mêmes ?

2 votes

@Damon : je pense qu'il utilise un int pour le datatype

2 votes

Non, ce sont des chaînes - vous pouvez le voir entre guillemets - mais c'est l'idée géniale : Avec cet ordre AAAA MM JJ il est possible de comparer les dates. @Damon cela devrait aussi fonctionner avec les tirets !

65voto

SQLite n'a pas de date dédiée types mais il a une quelques fonctions de date . Respectez les formats de représentation des chaînes de caractères (en fait, seulement les formats 1 à 10) compris par ces fonctions (en stockant la valeur sous forme de chaîne de caractères) et vous pourrez alors les utiliser. De plus, la comparaison lexicographique sur les chaînes de caractères correspondra à la comparaison des dates (tant que vous n'essayez pas de comparer les dates aux heures ou les dates aux heures, ce qui n'a pas beaucoup de sens de toute façon).

Selon la langue que vous utilisez, vous pouvez même obtenir conversion automatique . (Ce qui ne s'applique pas aux comparaisons dans les instructions SQL comme dans l'exemple, mais vous facilitera la vie).

13 votes

Pour tous ceux qui lisent la première phrase, en '17 SQLite dispose de date et datetime

3 votes

Hier, j'ai lu un article sur l'affinité des types ici : sqlite.org/datatype3.html En principe, si vous avez besoin d'une date, vous déclarez un date (ou datetime ) sur la colonne qui, en interne, est traitée comme une text . Cela correspond à mes besoins.

1 votes

3,5 ans plus tard, lorsque j'ai lu sqlite.org/datatype3.html : "SQLite n'a pas de classe de stockage prévue pour stocker les dates et/ou les heures" =)

45voto

Simon Points 288

J'ai eu le même problème récemment, et je l'ai résolu de la façon suivante :

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

0 votes

%s doit être placé entre guillemets simples, par exemple : strftime('%s', date)

0 votes

Cela fonctionne. Solution modifiée pour sélectionner toutes les lignes après une certaine date : SELECT * FROM table WHERE strftime('%s', added) > strftime('%s', "2017-01-01 00:00:00")

0 votes

J'évalue l'utilisation de strftime dans une clause WHERE comme dans cet exemple, et j'ai une question : Est-il efficace d'utiliser strftime comme ceci ? Est-elle évaluée une fois pour chaque ligne ou une fois par requête ?

26voto

ifredy Points 61

Ce qui suit fonctionne bien pour moi en utilisant SQLite :

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

0 votes

Cela a fonctionné pour moi sous iOS, Objective-C Ma requête est la suivante : SELECT COUNT(carSold) FROM cars_sales_tbl WHERE date BETWEEN '2015-04-01' AND '2015-04-30' AND carType = "Hybrid"

1voto

J. Polfer Points 5895

Vous pourriez également rédiger vos propres fonctions utilisateur pour traiter les dates dans le format que vous choisissez. SQLite dispose d'une méthode assez simple pour écrire vos propres fonctions utilisateur. Par exemple, j'en ai écrit quelques-unes pour additionner des durées de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X