2016-12-05 1 views
1

J'ai cette simple requête MysqlSQL entre ne pas retourner tous les résultats

select * 
from reportings 
where findcampaign = 1 and 
     is_click = 1 and 
     created_at BETWEEN date(2016-11-01) AND date(2016-12-31) 

Cela devrait retourner toutes les lignes où findcampaign = 1 et is_click est = 1 où les dates de created_at sont entre 01/11/2016 et 2016 -12-31.

course select * from reportings where findcampaign = 1 and is_click = 1

me donne 12 rangs

enter image description here

L'image montre que les reportings sont entre ces deux dates, donc je devrais obtenir 12 rangs. Est-ce la bonne façon d'obtenir la date entre et la date de la base de données même si mon created_at a une valeur d'horodatage. Ou devrais-je ajouter une heure aux dates?

+1

Essayez 'ENTRE « 01.11.2016 » ET « 2016-12-31'' les guillemets simples notes – RiggsFolly

+2

2016-11-01 est * 2004 * - soustraction de 3 ints, citez-le si c'est une chaîne de date. –

+0

Essayez d'entourer les dates entre guillemets simples, quelque chose comme 'date ('2016-11-01')' (la même chose pour l'autre). – FDavidov

Répondre

3

vous devez mettre des guillemets pour la date

select * 
from reportings 
where findcampaign = 1 and 
     is_click = 1 and 
     created_at BETWEEN date('2016-11-01') AND date('2016-12-31') 
+4

Vous n'avez même pas besoin d'envelopper les dates indiquées avec 'date()'. Il suffit d'utiliser 'BETWEEN '2016-11-01' ET '2016-12-31'' –

+0

@TimBiegeleisen Pour la chaîne c'est d'accord. mais en mentionnant date() ici, il doit être cité. au moins pour mysql. –

+0

Pourquoi utiliser une fonction 'date' avec un argument qui est lui-même date seulement – Rahul

1

hey juste petit copain d'erreur de syntaxe. virgule inversée nécessaire Date

essayer cette

 
select * from reportings where findcampaign = 1 and is_click = 1 and created_at BETWEEN date('2016-11-01') AND date('2016-12-31') 
1

Vous demandez au sujet de prédicats où vous comparez les dates des colonnes avec datetime données. Si vous mettez les dates dans des guillemets simples, comme cela a été mentionné, cela devrait fonctionner, mais il est souvent préférable d'être plus explicite sur ce qui se passe puisque BETWEEN lorsque vous travaillez avec des dates peut être déroutant.

Je recommande:

select * 
from reportings 
where findcampaign = 1 and 
     is_click = 1 and 
     created_at >= '2016-11-01 00:00:00' and 
     created_at <= '2016-12-31 00:00:00'; 

Cette condition est le même que celui de votre requête, et il est très clair que toutes les valeurs pour created_at le 31 Décembre 2016 sont exclus, de 2016-12-31 00:00:01 par 2016-12-31 23:59:59.

Vous pouvez inclure le 31 décembre 2016, auquel cas vous changeriez la deuxième date à 2017-01-01 00:00:00

+0

Et, je peux voir qu'il n'y a pas de dates 31 Dec dans l'ensemble de données, je pense que c'est une bonne pratique pour plus de clarté. – mendosi