2013-01-23 3 views
2

J'ai un champ timestamp dans une table MySQL. Je suis en train d'interroger la table à l'aide de la requête SQL suivante:Numéro de date MySQL et Coldfusion

SELECT login_mode,count(login_mode) as total 
FROM login_activity,ccac_registered_users 
WHERE login_activity.student_id=ccac_registered_users.student_id 
AND  login_date >= STR_TO_DATE('01/16/2013','%m/%d/%Y') 
AND  login_date <= STR_TO_DATE('01/17/2013','%m/%d/%Y') 
GROUP BY login_mode 

La requête fonctionne très bien quand je le lance sur Mysql directement, mais ne fonctionne pas de l'application coldfusion. Je suis perplexe! Le code pour générer les dates est:

login_date >= STR_TO_DATE(
       '#DateFormat(CreateODBCDate(startDate),'mm/dd/yyyy')#' 
       , '%m/%d/%Y' 
      ) 

Et l'erreur de ColdFusion est la suivante:

Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel que correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de '01/16/2013 '', ''% m /% d /% Y '') ET date_de_connexion < = STR_TO_DATE ('' 17/01/2013 '', '' % m /% d/» à la ligne 1

Quel est le problème ici?

Modifier

Je viens jeté sql que CF est essayer d'exécuter

SELECT login_mode,count(login_mode) as total 
FROM login_activity,ccac_registered_users 
WHERE login_activity.student_id=ccac_registered_users.student_id 
AND login_date >= STR_TO_DATE(''01/16/2013'',''%m/%d/%Y'') 
AND login_date <= STR_TO_DATE(''01/17/2013'',''%m/%d/%Y'') 

Il existe des guillemets supplémentaires autour de la date et ils sont à l'origine du problème. Si j'enlève les supplémentaires que j'ai ajoutés du code, alors rien ne sera ajouté.

+0

@Leigh La citation n'est pas manquante. C'est à la fin de la paranthésis. Je vais essayer d'utiliser simplement CreateODBCDate. AFAIK, ça ne fonctionnait pas avec mysql quand j'essayais le dernier. –

+0

Oh oui, vous avez raison. Mes yeux ont manqué une citation. – Leigh

+1

Vous pouvez également utiliser BETWEEN dans votre requête. –

Répondre

1

CFQUERY aime automatiquement les guillemets simples. Pour que cela fonctionne comme vous l'avez écrit, vous devez envelopper les éléments dans preserveSingleQuotes() pour empêcher CF d'ajouter les guillemets simples supplémentaires. Ou réécrivez-le en utilisant l'une des autres suggestions pour les comparaisons de dates.

+0

Cela a fonctionné! Merci! –

+0

Cela fait un moment que j'ai utilisé MySQL, mais si vous pouvez passer des arguments à une fonction en utilisant des guillemets, cela éviterait le problème: 'STR_TO_DATE (" # DateFormat (CreateODBCDate (startDate), 'mm/dd/yyyy ') # ","% m /% d /% Y ")' – imthepitts

+0

La requête est en cours de création dynamique et elle est déjà entourée de guillemets, d'où des guillemets simples. –

1

Je suggère d'utiliser DATEDIFF pour effectuer la date Comparaisons au lieu de comparer la date dans la chaîne, le travail très bien pour 4 de mes applications

détails ici: http://www.w3schools.com/sql/func_datediff_mysql.asp

+3

Je ne suis pas d'accord. L'utilisation de fonctions dans la clause where rend souvent les requêtes plus lentes. Cela serait particulièrement vrai si le domaine en question était indexé. –

1

En utilisation SQL:

CONVERT(DateTime, DateField, 104) 

ou essayez:

CAST(right(@date,4) + left(@date,4) as datetime) 

Je pensais que le ColdFu l'équivalent de la mesure était:

<cfset date = DateFormat(date, "mm/dd/yyyy")> 

- non?

+0

DateFormat ne fonctionne pas sur une chaîne, nécessite un objet date/heure. –

+0

ah, merci de clarifier cela. –

+2

@VaishakSuresh - Il est conçu pour * dates * oui. Mais comme avec la plupart des fonctions de date de CF, il accepte aussi facilement une chaîne de date "parseable". Notez qu'il est toujours interprété comme une chaîne de date américaine. – Leigh

4

Utilisez des paramètres de requête et des objets date plutôt que des chaînes. Comme ceci:

AND login_date >= <cfqueryparam cfsqltype="cf_sql_date" value="#CreateDate(2013,1,16)#"> 
AND login_date <= <cfqueryparam cfsqltype="cf_sql_date" value="#CreateDate(2013,1,17)#"> 
+0

Dan a perdu de vue alors qu'il me battait avec un exemple de code aussi! :) – BKK

7

(De mon commentaire précédent ...)

Il devrait y avoir absolument aucun besoin d'utiliser dateFormat ou str_to_date. DateFormat est conçu pour la présentation et renvoie une chaîne . Ce que vous devriez utiliser est un objet de date. CreateODBCDate vous donne déjà cela. Il suffit donc de l'utiliser directement dans votre requête. (Évidemment, vous devez toujours valider l'entrée en premier)

WHERE column >= #CreateODBCDate(startDate)# 
.... 

..ou mieux encore, utilisez cfqueryparam:

WHERE column >= <cfqueryparam cfsqltype="cf_sql_date" value="#startDate#">