2013-08-31 4 views
0

C'est ma table:MySQL sélectionner dateRange données de deux colonnes

ut_period

id | month | year | name 
1 | 9  | 2013 | dddd 
2 | 2  | 2017 | eeee 

Je veux des lignes de sélection sorcière dans 2013-8 et 2018-9. J'ai donc écrit cette requête, mais elle n'est pas réussie:

SELECT * 
FROM `ut_period` p 
WHERE `p`.`status` = 4 
    AND `p`.`year` >= '2013' 
    AND `p`.`mont` >= '8' 
    AND `p`.`year` <= '2018' 
    AND `p`.`month` <= '9' 

Comment puis-je le faire?

+0

quelle est la raison du vote à la baisse? –

+0

** Ne citez pas/ne marquez pas vos noms de colonne et de table. ** Ils ajoutent seulement de l'encombrement visuel et ne sont qu'un moyen supplémentaire de faire des erreurs de syntaxe. La seule raison pour laquelle vous en avez besoin est si vous avez un nom de colonne qui est un mot réservé, et l'utilisation de noms de colonne qui sont des mots réservés est une idée terrible, donc c'est deux mauvaises habitudes que vous pouvez éviter immédiatement. –

Répondre

1

Je trouve la meilleure façon de gérer « année-mois » est par multiplications - essentiellement, le nombre de mois depuis une date:

select p.* 
from ut_period p 
where (p.year * 12 + p.month) between 2013*12 + 8 and 2018*12 + 9; 

Si vous le souhaitez, vous pouvez également convertir en chiffres de la forme YYYYMM, ce qui le rend plus facile à mettre dans les valeurs constantes de la gamme:

select p.* 
from ut_period p 
where (p.year * 100 + p.month) between 201308 and 201809; 
0

Utilisez la BETWEEN clause pour le mois et l'année

(Documentation here)

En outre, vous devriez vraiment mettre le jour, le mois et l'année en une seule colonne - c'est pourquoi MySQL a types de champs liés à la date. Remplacez le jour, le mois et l'année par une seule colonne avec le type de champ DATE, vous pouvez ainsi comparer les dates beaucoup plus facilement.

Questions connexes