2010-06-08 5 views
10

Comment puis-je obtenir des enregistrements de ma table en utilisant mois/année? J'ai une table comme ceci:Sélection par mois d'un champ

Name - varchar 
DueDate -datetime 
Status -boll 

DueDate est le projet date d'échéance, je veux enregistrement correspondant au mois/année, ne date pas complète, je veux dire record pour le mois spécifique.

Comment puis-je faire cela dans mysql?

+0

semble que tout le monde était plus rapide que moi à taper! – espais

Répondre

35

utiliser simplement MONTH() et YEAR():

SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = 2010 
+5

Cela n'utilisera pas d'index s'il en existe un dans la colonne 'duedate'. La réponse de Todd R est le meilleur choix. –

+0

Très utile, merci! – tribulant

3
SELECT Name FROM Table Where MONTH(datetime) = 1; 

1 = Janvier.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_month

+0

et si la date est "1 JAN 2010" et "2 JAN 2009". Selon votre requête, il trouvera les deux – Salil

+0

Hmmm .. Sûrement il peut comprendre qu'il peut utiliser YEAR, je ne suis pas ici pour lui donner la réponse mais pour le guider. J'ai fourni la documentation de hem pour la fonction MONTH(), je suis sûr qu'il chercherait YEAR(), DAY() et HOUR() :) – RobertPitt

+0

Ceci n'utilisera pas un index s'il en existe un dans la colonne 'duedate'. La réponse de Todd R est le meilleur choix. –

1
SELECT * WHERE MONTH(DueDate) = '5' AND YEAR(DueDate) = '1987'; 
19

Vous pouvez utiliser une déclaration entre:

select * from Project 
    where DueDate between '2010-01-01' and '2010-02-01' 
+6

+1: Ceci utilisera un index s'il en existe un dans la colonne 'duedate'; les réponses utilisant les fonctions MONTH & YEAR ne le seront pas. –

3

il sélectionnera mois spécifique de l'année en cours

SELECT * FROM Project WHERE MONTH(DueDate) = 1 AND YEAR(DueDate) = YEAR(NOW()) 
4

N'utilisez pas cette solution recommandée avec MONTH() et YEAR(). Cela empêche MySQL d'utiliser index sur la colonne DueDate si vous en avez un et force MySQL à examiner toutes les lignes de la table.

Au lieu de cela, utilisez la clause BETWEEN comme ceci:

SELECT * FROM Project 
WHERE DueDate BETWEEN '2010-01-01' AND '2010-02-01' 

Ou une autre solution avec clause IN:

SELECT * FROM Project 
WHERE DueDate IN ('2010-01-01', '2010-01-02', '2010-01-03', ..., '2010-01-31') 

Ces deux solutions permet d'indexer MySQL utiliser, donc la performance sera meilleure.

+3

Le second est juste inutile. Qui préfèrerait fournir 31 dates au lieu de 2?! –

+0

Chaque fonction a ses usages. Peut-être que quelqu'un a besoin de choisir parmi une liste de dates. – GeneCode