Det er mange spørgsmål til en tråd .. men jeg vil prøve at løse de fleste af dem. (Det første spørgsmål kan du selv besvare, bare ved at prøve det;-)
For så vidt angår forespørgslen, selvom den kørte uden fejl - kan den forbedres. Jeg har ikke tænkt mig at omskrive forespørgslen for dig, men her er hovedproblemerne
-
For det første aldrig bruge rå klientværdier direkte i SQL. Brug altid
cfqueryparam
for at beskytte mod sql-injektion. Det har også andre fordele, men den er afgørende i en webapplikation. -
For det andet sender du datostrenge . Datostrenge er tvetydige og kan fejlfortolkes, afhængigt af formatet og værktøjet, der udfører parsingen. Det er meget bedre at bruge dato objekter i stedet. En måde at gøre det på er ved at bruge
cfqueryparam
og en af datotyperne:cf_sql_date
(kun dato) ellercf_sql_timestamp
(dato og tid). -
For det tredje, som jeg nævnte i din anden tråd , du skal virkelig forenkle din forespørgsel! At mange underforespørgsler allerede er uhåndterlige .. tilføjelse af datofiltre til hver underforespørgsel gør det direkte uoverskueligt. Jeg vil anbefale at se på måder at forenkle det på. Eds forslag tilbød én mulighed ved at reducere den til en enkelt
JOIN
og et par funktionskald.
Det er faktisk bare sådan din IDE vises det til mennesker. Det er ikke rigtig opbevaret på den måde. Internt gemmes datoer som store tal. Din forespørgsel skal dog tage højde for, at din kolonne gemmer en dato og tid.
Lad os sige, at du ønskede at hente alle optegnelser daterede i juni:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
Konceptuelt ville du have brug for et sql-udtryk som dette:
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
Men at konstruere disse dato/tidsværdier er en smule klunket IMO. En enklere måde at håndtere det på er at bruge dette paradigme:
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
Dit faktiske forespørgselsfilter ville se nogenlunde sådan ud:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
Ved at tilføje en dag til form.endDate
, og ved hjælp af en <
sammenligning er den resulterende forespørgsel:
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
Dette vil give nøjagtig de samme resultater som det tidligere BETWEEN-udtryk.