sql >> Databasteknik >  >> RDS >> Mysql

Datumformat och SQL Query förtydligande

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) eller cf_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.



  1. rake avbruten! oinitierad konstant Mysql2

  2. hur återställer man databasen i mysql?

  3. T-SQL få antal arbetsdagar mellan 2 datum

  4. solfläck solr odefinierad fälttyp