2010-06-01 5 views
2

J'ai une table avec des entrées qui a un champ DATE. Chaque entrée a une date distincte. Je voudrais sélectionner toutes les entrées du mois dernier enregistré dans la base de données. Comment?Comment sélectionner toutes les entrées du mois dernier?

J'ai essayé:

SELECT * 
    FROM registries 
WHERE reg_date = DATE_FORMAT(MAX(reg_date), "%m")` 

... sans succès

+3

Le dernier mois civil? Les 30 derniers jours? –

Répondre

1

Based sur la requête de OMG Ponies avec des corrections:

SELECT 
    r.* 
FROM 
    registries AS r 
JOIN (
    SELECT 
    MAX(t.reg_date) AS max_date 
    FROM 
    registries AS t) AS t 
ON DATE_FORMAT(t.max_date, '%Y-%m') = DATE_FORMAT(r.reg_date, '%Y-%m') 

Bien que les performances de la requête ne serait pas excellent, car il exploiterait le JOIN sur deux valeurs calculées. Je crois qu'il peut encore fonctionner décemment, sauf si vous commencez à battre des millions d'enregistrements.

D'un autre côté, vous pourriez probablement exécuter plus rapidement en questionnant d'abord pour le MAX (reg_date)

SELECT 
    CONCAT(DATE_FORMAT(MAX(r.reg_date), "%Y-%m"), '-01') AS first_day 
FROM 
    registries AS r 

Et puis en injectant le résultat dans une requête:

SELECT 
    r.* 
FROM 
    registries AS r 
WHERE 
    r.reg_date BETWEEN '<first_day>' AND LAST_DAY('<first_day>') 

Avec first_day comme un espace réservé pour le résultat de la requête précédente. Si vous avez indexé reg_date, cela devrait fonctionner assez vite.

Remarque: LAST_DAY est une fonction MySQL uniquement.

3

Si vous vouliez les 30 derniers jours, cela ne fonctionnera

SELECT * FROM `registries` 
WHERE `reg_date` > DATE_SUB(NOW(), INTERVAL 30 DAY) 
+0

Ceci. Utilisez ceci. – Entendu

0

Cela vous donnera tous les records pour le mois dernier (Mai):

SELECT [col,] DATEDIFF (TIMESTAMP, 2010-05-01 00:00) diF1, DATEDIFF (TIMESTAMP, 2010-05-31 00:00) diF2 DE tablename AYANT diF1> = 0 ET diF2 < = 0

Questions connexes