sql >> Database >  >> RDS >> Mysql

Datumnotatie en verduidelijking van SQL-query

Dat zijn veel vragen voor één draad .. maar ik zal proberen de meeste ervan te beantwoorden. (De eerste vraag die je zelf kunt beantwoorden, gewoon door het te proberen;-)

Wat betreft de query, zelfs als deze foutloos is verlopen, kan deze worden verbeterd. Ik ga de vraag niet voor je herschrijven, maar hier zijn de belangrijkste problemen

  • Ten eerste, nooit gebruik onbewerkte clientwaarden rechtstreeks in SQL. Gebruik altijd cfqueryparam om te beschermen tegen sql-injectie. Het heeft ook andere voordelen, maar die is van cruciaal belang in een webtoepassing.

  • Ten tweede geef je datumreeksen door . Datumreeksen zijn dubbelzinnig en kunnen verkeerd worden geïnterpreteerd, afhankelijk van het formaat en de tool die de parsering uitvoert. Het is veel beter om datum objecten te gebruiken in plaats van. Een manier om dat te doen is door cfqueryparam . te gebruiken en een van de datumtypes:cf_sql_date (alleen datum) of cf_sql_timestamp (datum en tijd).

  • Ten derde, zoals ik al zei op je andere thread , je moet je zoekopdracht echt vereenvoudigen! Dat veel subquery's is al onpraktisch.. het toevoegen van datumfilters aan elke subquery maakt het ronduit onhandelbaar. Ik zou aanraden om te kijken naar manieren om het te vereenvoudigen. Suggestie van Ed bood één mogelijkheid, door het te reduceren tot een enkele JOIN en een paar functieaanroepen.

Nou, eigenlijk is dat precies hoe je IDE weergeeft het aan de mens. Zo wordt het niet echt opgeslagen. Intern worden datums opgeslagen als grote getallen. Uw zoekopdracht moet echter rekening houden met het feit dat uw kolom een ​​datum en . opslaat tijd.

Stel dat u alle records gedateerd wilt ophalen in juni:

    form.startDate = "06/01/2013"
    form.endDate = "06/30/2013"

Conceptueel zou je een SQL-expressie als deze nodig hebben:

    WHERE column BETWEEN '06/01/2013 at midnight' AND '06/30/2013 11:59:59 PM' 

Het construeren van die datum / tijd-waarden is echter een beetje onhandig IMO. Een eenvoudigere manier om ermee om te gaan, is door dit paradigma te gebruiken:

   WHERE column >= {startDateAtMidnight}        
   AND   column <  {dayAfterEndDateAtMidnight}

Uw werkelijke zoekfilter ziet er ongeveer zo uit:

    WHERE column >= <cfqueryparam value="#form.startDate#" 
                                  cfsqltype="cf_sql_date">
    AND   column <  <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" 
                                  cfsqltype="cf_sql_date">

Door een dag toe te voegen aan form.endDate , en met behulp van een < vergelijking, de resulterende vraag is:

    WHERE column >= '2013-06-01 00:00:00'  
    AND   column < '2013-07-01 00:00:00'  

Dit levert exact dezelfde resultaten op als de eerdere BETWEEN-expressie.



  1. F# verbinden met Salesforce.com

  2. De meerdelige identifier kan niet worden gebonden

  3. Foutmelding:peer-authenticatie mislukt voor gebruiker postgres, bij het proberen om pgsql met rails te laten werken

  4. Enity Framework met MySQL