web-dev-qa-db-fra.com

Comparaison SQLite DateTime

Il semble que je ne puisse pas obtenir de résultats fiables de la requête par rapport à une base de données sqlite en utilisant une chaîne de date/heure comme comparaison:

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

comment dois-je gérer les comparaisons de date/heure avec sqlite?

update: field mydate est un type de données DateTime

Solution:

suivant la fonction datetime et ayant un format de chaîne tel que AAAA-MM-JJ HH: mm: ss i a 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')
104
Brad

SQLite n'a pas de date/heure dédiée types , mais a une peu de fonctions datetime Suivez les formats de représentation de chaîne (en réalité, uniquement les formats 1 à 10) compris par ces fonctions (stockant la valeur sous forme de chaîne), puis vous pourrez les utiliser. La comparaison lexicographique des chaînes correspondra à la comparaison datetime (tant que vous essayez de comparer les dates aux heures ou les dates entre les heures, ce qui n’a pas beaucoup de sens de toute façon).

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

51
Roger Pate

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

Cela fonctionne simplement tout le temps. Il vous suffit peut-être d'écrire un analyseur syntaxique pour gérer la manière dont les utilisateurs peuvent entrer leurs dates afin de pouvoir les convertir en YYYYMMDD.

92
Mark Smith

J'ai eu le même problème récemment, et je l'ai résolu comme ceci:

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

Ce qui suit fonctionne bien pour moi avec SQLite:

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

Sqlite ne peut pas comparer les dates. nous devons convertir en secondes et le convertir en entier. 

Exemple

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;
8
Hardeep Singh

La suite a fonctionné pour moi.

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'
4
Jose Jithin Stanly

J'ai une situation où je veux des données d'il y a deux jours et ce jusqu'à la fin de la journée… .. Je suis arrivé à ce qui suit.

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

D'accord, techniquement, je tire aussi à minuit demain comme l'affiche originale, s'il y avait des données, mais mes données sont toutes historiques.

Il est important de se rappeler que l’affiche initiale excluait toutes les données après le 2009-11-15 00:00:00. Ainsi, toutes les données enregistrées à minuit le 15 étaient incluses mais toutes les données après minuit le 15 n'étaient pas . Si leur requête était, 

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

Utilisation de la clause between pour plus de clarté.

Cela aurait été un peu mieux. Cela ne prend toujours pas en compte les secondes intercalaires dans lesquelles une heure peut en réalité avoir plus de 60 secondes, mais cela suffit pour les discussions ici :)

2
Lyall Pearce

Je devais stocker l'heure avec les informations de fuseau horaire et obtenir des requêtes fonctionnant sous le format suivant:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

L’heure est stockée dans la base de données sous forme de texte ordinaire au format suivant:

2015-03-06 20:12:15 -04:00
1
Eternal21

Vous pouvez également écrire vos propres fonctions utilisateur pour gérer les dates dans le format de votre choix. SQLite a une méthode assez simple pour écrire vos propres fonctions utilisateur. Par exemple, j'en ai écrit quelques-unes pour additionner les durées.

1
J. Polfer

Ma requête je l'ai fait comme suit:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

J'ai compris la réponse de @ ifredy. Tout ce que j'ai fait, c'est que je voulais que cette requête soit exécutée sous iOS, en utilisant Objective-C. Et il fonctionne!

J'espère que quelqu'un qui fait du développement iOS pourra utiliser cette réponse aussi!

0
Randika Vishman

En ce moment, je développe avec le package System.Data.SQlite NuGet (version 1.0.109.2) Qui utilise SQLite version 3.24.0.

Et ça marche pour moi.

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

Je ne fais pas de net pour utiliser la fonction datetime (). Peut-être ont-ils déjà mis à jour la requête SQL sur cette version de SQLite.

0
Aruman