web-dev-qa-db-fra.com

Date MySQL entre

FIXED - c'est ce que j'ai maintenant - Écrit en ASP

If Session("dateRange") = "Today" Then
        fromDate = Date()
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated = '"&fromDate&"' "
ElseIf Session("dateRange") = "Yesterday" Then
        fromDate = DateAdd("d",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated = '"&fromDate&"' "
ElseIf Session("dateRange") = "1 Week" Then
        fromDate = DateAdd("d",-7,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "1 Month" Then
        fromDate = DateAdd("m",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "3 Months" Then
        fromDate = DateAdd("m",-3,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "6 Months" Then
        fromDate = DateAdd("m",-6,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' "
ElseIf Session("dateRange") = "1 Year" Then
        fromDate = DateAdd("yyyy",-1,Date())
        fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate)
        whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
End If

Question originale:

C'est une question simple, mais pour une raison quelconque, je n'arrive pas à faire en sorte que cela fonctionne.

J'ai une boîte de recherche, à côté de celle-ci, un menu de sélection de plage de dates permettant à l'utilisateur de rechercher des photos au cours du dernier mois, des 6 derniers mois ou des 12 derniers mois.

Ce que j'ai n'a pas d'erreur mais il ne produit aucun résultat alors qu'il devrait le faire, c'est ça:

WHERE dateCreated BETWEEN "&DateAdd("m",-6,Date())&" AND "&Date()&"

La sortie SQL produit ceci:

dateCreated BETWEEN 18/03/2011 AND 18/09/2011 ORDER BY dateCreated DESC

Le champ 'dateCreated' de la base de données est défini sur (Date INDEX).

Quelqu'un peut-il voir ce qui ne va pas?

8
TheCarver

Les dates dans votre SQL résultant doivent être entre guillemets simples. Essayez d'encercler les parties dynamiques de votre requête avec des guillemets. Quelque chose comme ça:

WHERE dateCreated BETWEEN '"&DateAdd("m",-6,Date())&"' AND '"&Date()&"'

qui, je suppose, produirait ce SQL:

dateCreated BETWEEN '18/03/2011' AND '18/09/2011' ORDER BY dateCreated DESC

En outre, voyez si vous pouvez trouver un moyen de formater les dates au format plus habituel de MySQL yyyy-mm-dd. Comme ça:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC
31
Asaph

Si vous regardez spécifiquement en arrière à partir de "maintenant", pourquoi ne pas faire

where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 1 MONTH )
where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 6 MONTH )
where DateCreated >= DATE_SUB( CURDATE(), INTERVAL 12 MONTH )

Pas besoin d'une "Plage", insérez simplement la plage de mois que vous souhaitez autoriser ...

7
DRapp

%d-%m-%Y n'est pas un format de date approprié et les valeurs de date dans MySQL doivent toujours être citées comme des chaînes et un format ISO 8601 ('%Y-%m-%d'). 18/03/2011 sera interprété comme étant simplement 18 divisé par 03 et 2011, ce qui donne environ 0.002….

C'est-à-dire que votre code SQL devrait plutôt être comme le formulaire suivant:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC
2
minhee

Vous ne savez pas quelle technologie vous utilisez pour DateAdd(), mais votre format de date final est erroné en plus du fait que vos valeurs de date ne sont pas délimitées par des guillemets simples.

MySQL compare les dates en tant que 2011-03-18 et non 18/03/2011.

Une note que vous pouvez faire cela dans MySQL avec ses Fonctions Date/Heure . Bien que puisse empêcher la mise en cache de la requête.

0
Jason McCreary

Si ces chaînes ne sont pas entre guillemets, je pense que vous ne faites que la division, puis que vous comparez les dates entre une très petite période.

0
dlawrence