Det är många frågor för en tråd .. men jag ska försöka ta itu med de flesta av dem. (Den första frågan kan du svara själv, bara genom att prova den;-)
När det gäller frågan, även om den kördes utan fel - kan den förbättras. Jag tänker inte skriva om frågan åt dig, men här är huvudproblemen
-
För det första, aldrig använd råa klientvärden direkt i SQL. Använd alltid
cfqueryparam
för att skydda mot sql-injektion. Det har andra fördelar också, men den är avgörande i en webbapplikation. -
För det andra skickar du in datumsträngar . Datumsträngar är tvetydiga och kan misstolkas, beroende på formatet och verktyget som analyserar. Det är mycket bättre att använda datum objekt istället. Ett sätt att göra det är att använda
cfqueryparam
och en av datumtyperna:cf_sql_date
(endast datum) ellercf_sql_timestamp
(datum och tid). -
För det tredje, som jag nämnde i din andra tråd , du måste verkligen förenkla din fråga! Att många underfrågor redan är svårhanterliga ... att lägga till datumfilter till varje underfråga gör det rent av ohanterligt. Jag skulle rekommendera att titta på sätt att förenkla det. Eds förslag erbjöd en möjlighet, genom att reducera den till en enda
JOIN
och några funktionsanrop.
Det är faktiskt precis så din IDE visar det till människor. Det förvaras inte riktigt på det sättet. Internt lagras datum som stora siffror. Din fråga måste dock ta hänsyn till det faktum att din kolumn lagrar ett datum och tid.
Säg att du ville hämta alla poster daterade i juni:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
Begreppsmässigt skulle du behöva ett sql-uttryck så här:
WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM'
Men att konstruera dessa datum/tid-värden är lite klumpig IMO. Ett enklare sätt att hantera det är att använda detta paradigm:
WHERE column >= {startDateAtMidnight}
AND column < {dayAfterEndDateAtMidnight}
Ditt faktiska frågefilter skulle se ut ungefär så här:
WHERE column >= <cfqueryparam value="#form.startDate#"
cfsqltype="cf_sql_date">
AND column < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#"
cfsqltype="cf_sql_date">
Genom att lägga till en dag till form.endDate
, och med en <
Vid jämförelse är den resulterande frågan:
WHERE column >= '2013-06-01 00:00:00'
AND column < '2013-07-01 00:00:00'
Detta ger exakt samma resultat som det tidigare uttrycket BETWEEN.