2017-09-26 2 views
0

Je suis un peu confus sur la façon de filtrer les enregistrements par format de date.Les enregistrements de filtre MySQL sont définis à l'aide du format de date JJ-MM-AAAA

J'ai une colonne date du type de données date (aaaa-mm-jj) dans la table de dates.

Ex:

date 
----- 
2017-01-29 
2017-01-30 

Je suis veux changer le format (dd-mm-aaaa). J'utilise ce code

SELECT 
    DATE_FORMAT(`date`, '%d-%m-%Y') as date 
FROM 
    dim_date; 

date 
----- 
29-01-2017 
30-01-2017 

Je veux filtrer les enregistrements au format (jj-mm-aaaa). J'ai donc essayé ce code.

SELECT 
    DATE_FORMAT(`date`, '%d-%m-%Y') date 
FROM 
    dim_date 
WHERE DATE_FORMAT(`date`, '%d-%m-%Y') BETWEEN '20-04-2015' AND '06-09-2017'; 

Résultats Rien

Mais si j'essaie de filtrer avec le format original (aaaa-mm-jj) Il fonctionne.

SELECT DATE_FORMAT(`date`, '%d-%m-%Y') date 
FROM dim_date 
WHERE DATE_FORMAT(`date`, '%Y-%m-%d') BETWEEN '2015-04-20' AND '2017-01-07'; 

Pourquoi est ce comportement bizarre dans Mysql? Est-ce que j'ai râté quelque chose?

J'ai aussi essayé avec ce format DATE_FORMAT( Date , '%d-%c-%Y'), DATE_FORMAT( Date , '%d-%l-%Y') & DATE_FORMAT( Date , '%e-%l-%Y') Aucun visage heureux, S'il vous plaît laissez-moi connu.

Merci

Max

+0

je ne vois pas la différence entre les deux requêtes ... s'il vous plaît expliquer mieux – scaisEdge

+0

'Date_format' vous donnera une chaîne. Et si vous comparez vos valeurs sous la forme d'une chaîne, il n'y a pas de caractère qui soit '> = 2' et' <= 0' (qui est ce que 'entre '2' et '0'' chercheront). Pourquoi voulez-vous l'utiliser de cette façon? Vous pouvez simplement convertir votre entrée à une date valide et comparer des dates valides. Cela vous permettra également d'utiliser des index. Et, bien, il filtrera réellement comme vous le voulez pour fonctionner. – Solarflare

+0

@scaisEdge J'ai mis à jour la requête. s'il vous plait verifiez maintenant. Désolé, je suis confus avec les formats de date pour le moment. – MAX

Répondre

0

avec votre requête vous convertissez la date dans la chaîne et que vous comparez les valeurs en utilisant entre dans le mauvais ordre (« 20 »> « 06 ») donc ne fonctionnent pas. Entre exigent d'abord la valeur min et seconde la valeur max.

Si vous travaillez avec la date que vous Sould convertir la date chaîne
de sorte que le où entre le travail correcly et éviter le comportement de chaîne est filtre

SELECT date 
FROM dim_date 
WHERE date BETWEEN str_to_dat('20-04-2015', '%d-%m-%Y') 
      AND str_to_date('06-09-2017', '%d-%,-%Y'); 
+0

expliquez mieux vous commentez .. s'il vous plaît – scaisEdge

+0

votre mise à jour versione travail .. parce que la chaîne est cohérente avec les règles .mais le problème .. je suggère comme dans ma réponse l'utilisation de la date pour une meilleure comparaison .. donc au lieu de convertir un date dans la chaîne est à droite convertir une chaîne dans la date .. (ou utiliser le format strinf par défaut pour la date) – scaisEdge