2009-11-03 7 views
0

J'ai une base de données d'événements, et je dois être en mesure de montrer un événement survenu 'aujourd'hui'. Les événements ont des dates de début et de fin au format: Y-m-d h: i: sSélectionner un élément de la base de données en fonction de la période

Comment est-ce que je ferais ceci? J'ai essayé des requêtes le long des lignes de:

SELECT * 
FROM tbl_events 
WHERE start>='2009-11-03 16:00:00' 
and end<='2009-11-03 16:00:00' 

En vain. Tout avis serait grandement apprécié!

+0

Quel est le format des données stockées dans vos colonnes 'start' et' end'? Quel type de données sont ces colonnes? –

+0

Les champs sont datetime comme "Ymd h: i: s" Par exemple, un événement est: START 2009-11-02 12:00:00/END 2009-11-09 11:59:59 De préférence je serais capable de les sélectionner jusqu'à la seconde ... Aucune des solutions ci-dessous ne fonctionne correctement jusqu'à présent. – Aaron

+0

Y at-il une raison pour laquelle vous n'avez pas de guillemets autour du datetime dans votre requête? par exemple. ''2009-11-03 16: 00: 00'' – Dereleased

Répondre

0

Avez-vous essayé de convertir la chaîne datetime pour taper "datetime"?

SELECT 
    * 
FROM 
    tbl_events 
WHERE 
     start >= CAST('2009-11-03 16:00:00' AS DATETIME) 
    AND end <= CAST('2009-11-03 16:00:00' AS DATETIME) 

Ou, pour cette question, ce qui est mal à utiliser une fonction comme NOW() ou un mot clé comme CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_DATE?

Pour exmaple:

SELECT 
    * 
FROM 
    tbl_events 
WHERE 
     start >= CURRENT_TIMESTAMP 
    AND end <= CURRENT_TIMESTAMP 

EDIT: Andy-score peut être à quelque chose avec le entre l'opérateur et les mots réservés, quelque chose comme:

SELECT 
    * 
FROM 
    tbl_events 
WHERE 
     CURRENT_TIMESTAMP BETWEEN `start` AND `end` 
+0

Merci! J'avais complètement oublié l'opérateur entre ..! – Aaron

2

Si vous ne vous préoccupez les dates et pas le temps, cela fonctionnera pour « aujourd'hui »

select * from tbl_events where start >= curdate() and end < curdate() + 1 

Si vous souhaitez spécifier les dates et heures, cela fonctionnera:

select * from tbl_events 
where start >= '2009-11-03 08:00:00' and end <= '2009-11-03 16:00:00' 
+0

Salut tvor - votre option plus tard est ce que je suis après, étant en mesure de spécifier la date et l'heure, mais la requête ne fonctionne pas (c'est la même chose que le mien ci-dessus) – Aaron

0

Vous voulez sélectionner les événements qui se sont produits ce jour-là, pas à cette seconde précise, n'est-ce pas? D'où votre clause WHERE devrait ressembler plus à start = '2009-11-03'.

+0

De préférence réduit à temps, mais merci pour votre commentaire! – Aaron

0

La raison pour laquelle il peut maintenant travailler, pourrait être cette fin est un mot restreint (ou quelque chose de ce genre)

mysql.com begin-end info page

vous pouvez modifier vos noms de champs de base de données à event_start et event_end, ce qui, je l'espère, permettra de régler le problème, même si je pourrais parler des ordures.

Aussi, si elle aide à tout ce que vous pouvez utiliser la méthode suivante pour obtenir des dates d'une gamme

SELECT * FROM tbl_event WHERE event_start BETWEEN (start_date) AND (end_date) 

Ce ne porte que sur un champ, dans ce event_start cas, mais signifie que si vous voulez obtenir plage des événements qui ont une date de début entre une plage définie, vous pouvez.

+0

également, en volant le commentaire de quelqu'un d'autre, c'est probablement une bonne idée d'entourer vos paramètres de plage de dates en 's (guillemets simples) car cela aidera à contenir les données transmises dans la requête. – andyface

+0

Merci pour toute votre aide, «entre» fait le tour, j'avais complètement oublié cet opérateur! – Aaron

+0

pas de soucis, ont récemment commencé à l'utiliser correctement, donc était frais dans mon esprit, mais très utile. – andyface

0
select count(*) as ce from estudantes where nascimento between DATE_SUB(CURDATE(),INTERVAL 18 YEAR) and DATE_SUB(CURDATE(),INTERVAL 25 YEAR) 
Questions connexes