2009-10-21 4 views
2

Je stocke des événements récurrents dans un tableau d'événements qui a lieu pendant certains mois de l'année, n'importe quelle année et chaque année. Par exemple;est là la notation sql qui peut dire vérifier entre les mois?

CREATE TABLE events ( 
    event_id tinyint(3) unsigned NOT NULL auto_increment, 
    name varchar(255) NOT NULL, 
    month_from tinyint(3) unsigned NOT NULL, 
    month_to tinyint(3) unsigned NOT NULL, 
    PRIMARY KEY (event_id)) 
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; 

INSERT INTO events 
    (event_id, name, month_from, month_to) 
VALUES 
    (1, 'Event ABC', 5, 11), (2, 'Event XYZ', 12, 4); 

événement ABC - a lieu chaque année au mois de mai - novembre et XYZ événement - a lieu chaque année au cours de décembre à avril

Dans ma table d'événements je stocker les month_from et month_to sous forme de valeurs numériques . Ce que je veux être en mesure de faire est de prendre le mois en cours (Oct) et de le passer dans une requête sql pour qu'il me renvoie l'événement correct "Event ABC". Mais aussi je veux passer à un mois futur de dire Fév il devrait me revenir "Event XYZ"

J'espère que cela a du sens?

Répondre

1

select * from tbl where (month_from <= $YOUR_MONTH and month_to >= $YOUR_MONTH) or (month_from > month_to and (month_to >= $YOUR_MONTH or month_from <= $YOUR_MONTH)

cela travaillera également pour les gammes DEC-avril

+0

Arh ha sympa jab11 - vous avez manqué une dernière parenthèse fermante mais beaucoup de mercis fonctionne un régal :-) –

0
select * from tbl 
where month_from <= <YOUR_MONTH> and month_to >= <YOUR_MONTH> 

à condition que <YOUR_MONTH> est une valeur qui sémantiquement équivalente aux champs de month_from et month_to.

MISE À JOUR: Il suffit de remarquer le deuxième exemple de décembre à avril Peut-être que vous pouvez créer deux gammes pour l'événement de décembre à décembre et janvier à avril

1

Essayez:

FROM TABLE t 
WHERE @month BETWEEN t.month_from AND t.month_to 

Si vous voulez passer une date & obtenir le mois de la date de la comparaison:

FROM TABLE t 
WHERE MONTH(@your_date) BETWEEN t.month_from AND t.month_to 

Référence: MONTH

+0

Merci pour les réponses. Le sql fonctionne bien si j'envoie dans un mois la valeur de say 7 (juillet) il retourne un événement, mais rien pour dire 3 (mars). Voici mon sql_dump CREATE TABLE 'events' ( ' event_id' tinyint (3) non signé NOT NULL auto_increment, 'name' varchar (255) NOT NULL, ' month_from' tinyint (3) non signé NOT NULL, 'month_to' tinyint (3) unsigned NOT NULL, PRIMARY KEY (' event_id') ) MOTEUR = CHARGEUR PAR DÉFAUT MyISAM = utf8 AUTO_INCREMENT = 3; INSERT INTO 'events' (' event_id', 'nom',' month_from', 'month_to') VALEURS (1, 'Événement ABC', 5, 11), (2, 'Événement XYZ', 12, 4) –

0

Cela devrait le faire:

SELECT * FROM events WHERE month_from <= $your_month AND month_to >= $your_month 

Vous n'êtes pas limité à quelques mois comme entiers. Vous pouvez utiliser le type de données DATE avec MySQL (ou équivalent pour votre base de données) et utiliser la même requête que ci-dessus. Votre base de données va "comprendre" les opérateurs <,>, = pour vos champs DATE.

Questions connexes