Това са много въпроси за една тема .. но ще се опитам да отговоря на повечето от тях. (Първият въпрос, на който можете да си отговорите, просто като го опитате;-)
Що се отнася до заявката, дори и да работи без грешка - може да се подобри. Няма да пренаписвам заявката вместо вас, но ето основните проблеми
-
Първо,никога използвайте необработени клиентски стойности директно в SQL. Винаги използвайте
cfqueryparam
за защита срещу sql инжекция. Има и други предимства, но това е от решаващо значение за уеб приложение. -
Второ, предавате низове за дата . Низовете за дата са двусмислени и могат да бъдат тълкувани погрешно, в зависимост от формата и инструмента, извършващ синтактичния анализ. Много по-добре е да използвате обекти с дата вместо. Един от начините да направите това е като използвате
cfqueryparam
и един от типовете дата:cf_sql_date
(само дата) илиcf_sql_timestamp
(дата и час). -
Трето, както споменах в другата ви нишка , наистина трябва да опростите заявката си! Това много подзаявки вече е тромаво .. добавянето на филтри за дата към всяка подзаявка я прави направо неуправляема. Бих препоръчал да разгледате начини да го опростите. Предложение на Ед предлага една възможност, като я сведе до един
JOIN
и няколко извиквания на функции.
Всъщност точно така показва вашата IDE то на хората. Всъщност не се съхранява по този начин. Вътрешно датите се съхраняват като големи числа. Въпреки това, вашата заявка трябва да отчита факта, че колоната ви съхранява дата и време.
Да речем, че искате да извлечете всички записи с дата през юни:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
Концептуално ще ви е необходим sql израз като този:
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
Въпреки това, конструирането на тези стойности за дата/час е малко тъпо IMO. По-прост начин за справяне е използването на тази парадигма:
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
Вашият действителен филтър за заявки би изглеждал така:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
Като добавите един ден към form.endDate
и с помощта на <
сравнение, получената заявка е:
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
Това ще доведе до точно същите резултати като по-ранния израз BETWEEN.