2016-08-16 3 views
1

J'essaie de récupérer des enregistrements qui tombent dans une année et un mois spécifiques à partir d'un ensemble complet d'enregistrements récupérés pour un utilisateur particulier. Tout d'abord, le champ en question itemdate est MySql type Datetime (par exemple, 2016-08-15 20:00:25). Il y a 4 lignes d'enregistrements pour un utilisateur:Coldfusion Requête MySQL dans une requête

2016-08-15 20:00:25 
2015-06-01 20:25:05 
2016-08-15 20:26:00 
2016-08-15 23:30:35 

Ces enregistrements pour un utilisateur particulier sont récupérés par:

<cfquery datasource="userdatbase"name="reportlist"> 
select itemid, itemdate, itemvalue 
from itemlib 
where userid = '#currentuserid#' 
</cfquery> 

L'année en cours et mois est déterminé par:

<cfset thisyear = #Year(Now())#> 
<cfset thismonth = #Month(Now())#> 

Maintenant, filtrez la requête d'origine et obtenez seulement ceux de l'année et du mois en cours:

<cfquery dbtype="query" name="detail"> 
     select itemid, itemdate, itemvalue 
     from reportlist 
     where year(itemdate) = #thisyear# 
     and month(itemdate) = #thismonth# 
    </cfquery> 

Je reçois l'erreur suivante:

Erreur lors de l'exécution de la requête de base de données.

Erreur de syntaxe Query Of Queries. . Rencontrés « année expression conditionnelle incorrecte, prévue l'un des [comme | null | entre | en | comparaison] condition,

J'ai essayé de le faire à la place:

<cfquery dbtype="query" name="detail"> 
     select itemid, itemdate, itemvalue 
     from reportlist 
     where #year(reportlist.itemdate)# = #thisyear# 
     and #month(reportlist.itemdate)# = #thismonth# 
    </cfquery> 

qui va se débarrasser de l'erreur Cependant, j'ai obtenu toutes les 4 rangées d'enregistrements dans le détail requête au lieu du attendu 3. Je ne m'attends pas à ce que l'enregistrement 2015-06-01 20:25:05 soit sélectionné, mais il le fait. Je me gratte la tête dessus, toute aide est appréciée Merci d'avance

+0

êtes-vous sûr que les fonctions mois/année sont pris en charge si le type de connexion/pilote que vous utilisez? Mois/année semble être pris en charge par MySQL, donc je ne pense pas que le moteur a du mal à analyser la requête .. https://dev.mysql.com/doc/refman/5.5/fr/date-and-time-functions .html # function_month – xQbert

+0

* Cependant, j'ai obtenu tous les 4 lignes * Parce que la requête SQL ne fait pas ce que vous pensez qu'il est ...Vous faites une comparaison de deux valeurs littérales, comme 'WHERE 1 = 1'. Il sera toujours vrai (ou faux) pour chaque ligne de la requête. – Leigh

+0

Qu'advient-il de votre page si vous mettez une plage de dates dans la requête de base de données d'origine? –

Répondre

5

Une requête coldfusion de requêtes (QofQ) n'a pas toutes les fonctionnalités d'un dbms. year() n'est pas pris en charge dans la syntaxe QofQ.

Votre deuxième requête est syntaxiquement correct, car il passe à la valeur du reportlist.itemdate, qui sera la valeur de itemdate dans la première ligne de la requête reportlist (en supposant que vous n'êtes pas bouclez reportlist). ColdFusion interprète cela comme la comparaison de deux valeurs littérales au lieu de comparer les valeurs de ligne dans la requête.

Sinon, vous pouvez définir une variable (fromDate) à la première date du mois que vous voulez, puis filtrer votre requête lorsque la date de l'article est >= la fromDate et < fromDate plus 1 mois. Voir ci-dessous:

<!--- set fromDate to the first date of the month ---> 
<cfset fromDate = createDate(thisyear, thismonth, 1) /> 
<cfquery dbtype="query" name="detail"> 
    select itemid, itemdate, itemvalue 
    from reportlist 
    where itemdate >= <cfqueryparam value="#fromDate#" cfsqltype="cf_sql_date" /> 
      and itemdate < <cfqueryparam value="#dateAdd('m', 1, fromDate)#" cfsqltype="cf_sql_date" /> 
</cfquery> 

Cela permet d'obtenir la même chose en utilisant des comparateurs pris en charge dans ColdFusion QoQ.

Quelques documents utiles ici: http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html

+0

Merci @beloitdavisja Je ne savais pas que YEAR et MONTH ne fonctionneraient pas sur QofQ mais je pensais que MySQL avait aussi ces fonctions. Pourquoi la fonction MySQL n'a pas démarré dans ma première tentative de QofQ? Je ne savais pas non plus que CF ne fonctionnerait pas sur des valeurs de ligne individuelles car elle renvoyait 4 lignes et non une seule. Si j'avais la boucle il ne renverrait pas 16 lignes (4x4)? C'est la première fois que j'utilise QofQ et ça m'a rendu fou. – Jack

+1

@Jack MySQL a ces fonctions. Cependant, une requête de requêtes * ne fonctionne pas dans MySQL. Un QofQ est le plus souvent utilisé pour filtrer ou modifier le jeu de résultats d'une requête de base de données en mémoire. C'est un outil puissant, mais peut être frustrant car il a ses propres règles et sa syntaxe limitée. Ce n'est pas un langage de requête de base de données complet comme MySQL et n'utilise aucune fonctionnalité de ces langages de requête de base de données, même si le jeu de résultats provient d'une base de données MySQL. – beloitdavisja

+1

* J'ai besoin de vérifier s'il y a quelque chose pour l'utilisateur * Il est également important de noter que vous n'avez pas besoin de plusieurs requêtes (ou QoQ) du tout. Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser JOIN sur itemlib et reportlist, et le filtrer sur userID? – Leigh