2010-01-11 8 views
7

Tous,MYSQL - Retrouver les horodatages entre les dates

J'ai une table MYSQL avec une colonne appelée timestamp. Il est de type DATETIME et a des valeurs comme "10/1/2009 3:25:08 PM", "10/1/2009 3:30:05 PM", "10/4/2009 3:40:01 PM" , etc ..

Je veux écrire une requête SQL pour sélectionner toutes les valeurs dans le champ d'horodatage se produisant entre deux dates .. quelque chose comme ceci:

select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate 

les dates de userInput seront pas parties de temps. pouvez-vous s'il vous plaît suggérer la syntaxe MySQL Query pour cela? Merci

+0

Par "il est de la propriété datetime" voulez-vous dire qu'il a le type de données 'DATETIME'? – Quassnoi

+0

oui. c'est correct – Jake

Répondre

14
SELECT timestamp 
FROM tablename 
WHERE timestamp >= userStartDate 
     AND timestamp < userEndDate + INTERVAL 1 DAY 

cela sélectionnera tous les records Havi La partie de date comprise entre userStartDate et userEndDate, à condition que ces zones aient le type DATE (sans partie de temps).

Si les dates de début et de fin venir sous forme de chaînes, utilisez STR_TO_DATE pour convertir un format donné:

SELECT timestamp 
FROM tablename 
WHERE timestamp >= STR_TO_DATE('01/11/2010', '%m/%d/%Y') 
     AND timestamp < STR_TO_DATE('01/12/2010', '%m/%d/%Y') + INTERVAL 1 DAY 
+0

hmm .. Est-ce que userStartDate peut être au format "10/01/2009"? (mm/jj/aaaa) – Jake

8
SELECT timestamp 
FROM myTable 
WHERE timestamp BETWEEN startDate AND endDate 

Pour obtenir les meilleurs résultats lors de l'utilisation BETWEEN avec des valeurs de date ou d'heure, vous devez utiliser CAST() pour convertir explicitement les valeurs au type de données souhaité. Exemples: Si vous comparez DATETIME à deux valeurs DATE, convertissez les valeurs DATE en valeurs DATETIME. Si vous utilisez une constante de chaîne telle que '2001-1-1' dans une comparaison à un DATE, transtypez la chaîne en DATE.

-http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

+1

Si 'startDate' et' endDate' sont à la fois 'Jan 11, 2010', ceci sélectionnera seulement les enregistrements avec' timestamp = 11 janvier 2010 00: 00: 00', pas tous les enregistrements ayant '' Jan 11' dans la partie date. – Quassnoi

+0

Vous avez raison, Quassnoi. Si c'est possible avec les données des utilisateurs, ajoutez 24 heures (comme vous l'avez fait dans votre exemple). J'avais supposé que l'utilisateur utiliserait les valeurs dateTime dans la requête elle-même. – Sampson

4

Les dates de UserInput n'auront pas horodatages. Vous pouvez convertir l'entrée d'utilisateur à horodatage avec:

mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19'); 
     -> 1196440219 

Votre requête peut devenir:

select timestamp from tablename 
where timestamp >= UNIX_TIMESTAMP(userStartDate) 
and timestamp <= UNIX_TIMESTAMP(userEndDate) 
2

Si vous cherchez à interroger un événement entre deux horodatages, pour un calendrier ou quelque chose où le début et la fin sont stocké comme un horodatage, vous pouvez l'utiliser

$qry = "SELECT * 
     FROM `table` 
     WHERE '$today_start' >= `event_start` 
      AND '$today_start' <= `event_end`"; 
Questions connexes