web-dev-qa-db-fra.com

SQL Select entre les dates

J'utilise sqlite pour sélectionner des données entre deux plages pour un rapport de vente. Pour sélectionner les données entre deux dates, j'utilise l'instruction suivante:

SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";

Cette déclaration saisit toutes les dates, même celles en dehors des critères. Le format de date que vous voyez entré est dans le même format que celui que je récupère. Je ne suis pas sûr de ce qui ne va pas, mais j'apprécie l'aide que je peux trouver. Merci!

62
Zombian

SQLite exige que les dates soient au format YYYY-MM-DD. Étant donné que les données de votre base de données et la chaîne de votre requête ne se trouvent pas dans ce format, vos "dates" sont probablement traitées comme des chaînes.

86
Eric Petroelje

Changez vos données en utilisant ces formats formats sqlite datetime .

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD

SELECT * FROM test WHERE date BETWEEN '2011-01-11' AND '2011-08-11'
29
Utku Yıldırım

Une autre façon de sélectionner les dates dans SQLite consiste à utiliser la puissante fonction strftime :

SELECT * FROM test WHERE strftime('%Y-%m-%d', date) BETWEEN "11-01-2011" AND "11-08-2011"

Celles-ci sont équivalentes selon https://sqlite.org/lang_datefunc.html :

date(...)

strftime('%Y-%m-%d', ...)

mais si vous voulez plus de choix, vous l'avez.

13
AFD

Ou vous pouvez convertir votre chaîne au format Date avec la fonction date. Même la date est stockée sous forme de texte dans la base de données. Comme ceci (la variante la plus pratique):

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11')
4
adudakov
SELECT *
FROM TableName
WHERE julianday(substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2)) BETWEEN julianday('2011-01-11') AND julianday('2011-08-11')

Notez que j'utilise le format: dd/mm/yyyy

Si vous utilisez d/m/aaaa, changez en substr()

J'espère que ceci vous aidera.

3

Un merci spécial à Jeff et vapcguy votre interactivité est vraiment encourageante.

Voici une déclaration plus complexe qui est utile lorsque la longueur entre '/' est inconnue:

SELECT * FROM tableName
WHERE julianday(
    substr(substr(date, instr(date, '/')+1), instr(substr(date, instr(date, '/')+1), '/')+1)
||'-'||
    case when length(
    substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1),'/')-1)
    )=2
    then
    substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
    else
    '0'||substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
    end
||'-'||
    case when length(substr(date,1, instr(date, '/')-1 )) =2
    then substr(date,1, instr(date, '/')-1 )
    else
    '0'||substr(date,1, instr(date, '/')-1 )
    end
) BETWEEN julianday('2015-03-14') AND julianday('2015-03-16') 
1
TROUZINE Abderrezaq