2010-12-10 47 views
3

J'ai un code SQL qui fonctionne très bien et qui renvoie les résultats souhaités à partir de ma base de données Wordpress.Filtre de comparaison de date MySQL

Cependant, je ne peux tout simplement pas obtenir ma tête comment filtrer les dates entre, par exemple:

2010-12-10 00:00:00 

et

2010-12-15 00:00:00 

Voici mon code SQL:

$SQL_K = "SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
      FROM wp_posts 
      JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
      WHERE 1 = 1 
       AND wp_posts.post_type = 'post' 
       AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
       AND wp_postmeta.meta_key = 'expiry_date' 
     GROUP BY wp_posts.ID 
     ORDER BY wp_posts.post_date DESC 
      LIMIT 0, 100 "; 
+2

Comment faire vous appelez le 15ème mois de l'année? –

+0

oups, good spot ring0 –

+0

2010-15-10 ne correspond pas au format AAAA-MM-JJ que MySQL accepte par défaut, donc je corrigerais ces instances afin de pouvoir utiliser la fonctionnalité liée à la date de MySQL. –

Répondre

6
WHERE date_column BETWEEN STR_TO_DATE('2010-12-10', '%Y-%m-%d') AND STR_TO_DATE('2010-12-15', '%Y-%m-%d') 

Comme ça?

EDIT: oublié un devis de fermeture. oups

EDITv2: Ajout de votre code avec la requête mise à jour

EDITv3: petite optimisation supprimé 1 = 1 comparaison, utilise IN() pour wp_posts.post_status

SELECT  SQL_CALC_FOUND_ROWS wp_posts.* 
FROM  wp_posts 
    JOIN  wp_postmeta 
    ON  (wp_posts.ID = wp_postmeta.post_id) 
WHERE  wp_posts.post_type = 'post' 
    AND  (wp_posts.post_status IN ('publish','private')) 
    AND  wp_postmeta.meta_key = 'expiry_date' 
    AND  ___INSERT_NAME_OF_DATE_COLUMN_HERE___ 
    BETWEEN STR_TO_DATE('2010-12-05', '%Y-%m-%d') 
     AND STR_TO_DATE('2010-12-15', '%Y-%m-%d') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC 
LIMIT  0, 100 
+0

merci accouplent, je reçois aucun résultat maintenant (ma faute si de gros). $ SQL_K = « SELECT * FROM SQL_CALC_FOUND_ROWS wp_posts wp_posts wp_postmeta ON Inscrivez-vous (wp_posts.ID = wp_postmeta.post_id) 1 = 1 ET wp_posts.post_type = 'post' ET (wp_posts.post_status = 'publier' OU wp_posts.post_status = 'private') ET wp_postmeta.meta_key = 'expiry_date' O WH wp_postmeta.meta_key = 'expiry_date' ENTRE LE STR_TO_DATE ('2010-12- 05 ','% Y-% m-% d ') ET STR_TO_DATE (' 2010-12-15 ','% Y-% m-% d ') GROUP BY wp_posts.ID ORDRE PAR wp_posts.post_date DESC LIMIT 0, 100 "; –

+0

Je vois un double là-bas. Essayez de supprimer cela et de le remplacer par un 'AND'. Je montrais la clause WHERE pour le placement, pas pour la syntaxe. ;-) –

+0

Brad, merci beaucoup pour votre code et votre aide. Les résultats montrent maintenant, mais si je change les dates entre 2010-12-06 - 2010-12-08 (entre autres), les mêmes résultats montrent etc et ne sont pas filtrés .. Si proche –

1
use between date1 and date2 
+0

merci aussi accouplent –