To je hodně otázek na jedno vlákno, ale většinu z nich se pokusím vyřešit. (Na první otázku si můžete odpovědět sami, stačí to zkusit;-)
Pokud jde o dotaz, i když běžel bez chyby - lze jej zlepšit. Nehodlám vám přepisovat dotaz, ale zde jsou hlavní problémy
-
Za prvé, nikdy používat nezpracované klientské hodnoty přímo v SQL. Vždy používejte
cfqueryparam
na ochranu před sql injection. Má také další výhody, ale ta je ve webové aplikaci kritická. -
Za druhé, předáváte řetězce data . Řetězce data jsou nejednoznačné a mohou být nesprávně interpretovány v závislosti na formátu a nástroji, který analýzu provádí. Je mnohem lepší použít datum objektů namísto. Jedním ze způsobů, jak toho dosáhnout, je použití
cfqueryparam
a jeden z typů dat:cf_sql_date
(pouze datum) nebocf_sql_timestamp
(datum a čas). -
Zatřetí, jak jsem zmínil v vaše další vlákno , opravdu potřebujete zjednodušit svůj dotaz! Tolik poddotazů je již nepraktické... přidáním datových filtrů do každého poddotazu je naprosto nezvládnutelný. Doporučil bych se podívat na způsoby, jak to zjednodušit. Edův návrh nabídl jednu možnost tím, že ji zredukoval na jediný
JOIN
a několik volání funkcí.
No ve skutečnosti je to přesně to, jak se vaše IDE zobrazuje to lidem. Ve skutečnosti se takto neukládá. Interně jsou data uložena jako velká čísla. Váš dotaz však musí zohlednit skutečnost, že váš sloupec obsahuje datum a čas.
Řekněme, že chcete načíst všechny záznamy datované v červnu:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
Koncepčně byste potřebovali sql výraz, jako je tento:
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
Konstrukce těchto hodnot data/času je však IMO trochu neohrabaná. Jednodušší způsob, jak to zvládnout, je použít toto paradigma:
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
Váš skutečný filtr dotazů by vypadal asi takto:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
Přidáním jednoho dne do form.endDate
a pomocí <
porovnání, výsledný dotaz je:
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
To poskytne přesně stejné výsledky jako dřívější výraz BETWEEN.