2016-04-26 9 views
1

Ich habe eine Abfrage erstellt mit cfspreadsheet, die eine Datumsspalte namens "ActionDate" hat, und das Durchlaufen der Abfrage mit isDate() zeigt, dass es eine Datumsspalte ist, aber in einer Abfrage dieser Abfrage ist als eine Zeichenfolge behandelt werden. Also, wenn ich ein Datum Filter in der where-Klausel anwenden, tut es nicht den Vergleich richtig:ColdFusion-Abfrage des Abfragedatumsvergleich

<cfquery ... > 
SELECT * 
FROM arguments.q 
WHERE 1=1 
<cfif isDate(arguments.dateFrom)> 
    AND actiondate >= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#arguments.dateFrom#"> 
</cfif> 
<cfif isDate(arguments.dateFrom)> 
    AND actiondate <= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#arguments.dateTo#"> 
</cfif> 
</cfquery> 

actiondate kommt im Format mm/dd/yyyy. Wenn ich die where-Klausel mit Stringliterale als Test zu tun, es funktioniert:

...where actiondate = '11/05/2015' --returns all rows with that "date" 

<cfset tempdate = createdate(2015,11,5)>... 
...where actiondate = <cfqueryparam cfsqltype="cf_sql_date" value="#temp#"> --returns nothing 

Aber auch hier isDate(actiondate) gibt true zurück, wenn sie durch die Abfrage Looping. Ich kann das Problem umgehen, aber gibt es eine Möglichkeit, das zu tun, was ich brauche, um noch eine Suchanfrage zu verwenden?

+3

Sie erkennen, dass beide Ihre cfifs den gleichen Wert überprüfen? – Tomalak

+0

Den Parameter in Anführungszeichen setzen: ''''. Funktioniert es? – trincot

+0

@trincot, hast du das selbst versucht? Hast du die erwarteten Ergebnisse erhalten? –

Antwort

4

(Von Kommentare ...)

IsDate prüft einen Wert kann in ein Datum umgewandelt werden. Das bedeutet nicht, dass der Wert ein Datum/Uhrzeit-Objekt ist. Im Fall von cfspreadsheet sind die zurückgegebenen Abfragewerte Zeichenfolgen. Wenn Sie sie mit den cfqueryparam-Werten vergleichen, bei denen es sich um Datums-/Uhrzeitobjekte handelt, vergleichen Sie Äpfel und Orangen. Also führt der QoQ eine implizite Umwandlung der Datum/Zeit-Werte in einen String durch und kommt mit der falschen Antwort auf.

Um einen Datumsvergleich auf "ActionDate" durchzuführen, müssen Sie CAST verwenden, um die Strings zuerst in ein Datums-/Zeitobjekt zu konvertieren. Unter der Annahme, dass alle Werte gültige Datumszeichenfolgen sind, versuchen Sie es im Format MM/TT/JJJJ mit einem fest codierten Wert wie dem 11/05/2015. Dann schließe deine Variablen an.

WHERE CAST(actionDate AS DATE) = <cfqueryparam value="11/05/2015" 
            cfsqltype="cf_sql_date"> 
Verwandte Themen