sql >> Database teknologi >  >> RDS >> Mysql

Datoformat og SQL Query afklaring

Det er mange spørgsmål til en tråd .. men jeg vil prøve at løse de fleste af dem. (Det første spørgsmål kan du selv besvare, bare ved at prøve det;-)

For så vidt angår forespørgslen, selvom den kørte uden fejl - kan den forbedres. Jeg har ikke tænkt mig at omskrive forespørgslen for dig, men her er hovedproblemerne

  • For det første aldrig bruge rå klientværdier direkte i SQL. Brug altid cfqueryparam for at beskytte mod sql-injektion. Det har også andre fordele, men den er afgørende i en webapplikation.

  • For det andet sender du datostrenge . Datostrenge er tvetydige og kan fejlfortolkes, afhængigt af formatet og værktøjet, der udfører parsingen. Det er meget bedre at bruge dato objekter i stedet. En måde at gøre det på er ved at bruge cfqueryparam og en af ​​datotyperne:cf_sql_date (kun dato) eller cf_sql_timestamp (dato og tid).

  • For det tredje, som jeg nævnte i din anden tråd , du skal virkelig forenkle din forespørgsel! At mange underforespørgsler allerede er uhåndterlige .. tilføjelse af datofiltre til hver underforespørgsel gør det direkte uoverskueligt. Jeg vil anbefale at se på måder at forenkle det på. Eds forslag tilbød én mulighed ved at reducere den til en enkelt JOIN og et par funktionskald.

Det er faktisk bare sådan din IDE vises det til mennesker. Det er ikke rigtig opbevaret på den måde. Internt gemmes datoer som store tal. Din forespørgsel skal dog tage højde for, at din kolonne gemmer en dato og tid.

Lad os sige, at du ønskede at hente alle optegnelser daterede i juni:

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

Konceptuelt ville du have brug for et sql-udtryk som dette:

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

Men at konstruere disse dato/tidsværdier er en smule klunket IMO. En enklere måde at håndtere det på er at bruge dette paradigme:

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

Dit faktiske forespørgselsfilter ville se nogenlunde sådan ud:

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

Ved at tilføje en dag til form.endDate , og ved hjælp af en < sammenligning er den resulterende forespørgsel:

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

Dette vil give nøjagtig de samme resultater som det tidligere BETWEEN-udtryk.



  1. PostgreSQL 11:Hvad er nyt

  2. Hvad er SQL Server?

  3. Den enkleste overgang fra MySQL til MySQLi

  4. Flytning af Wordpress-websted til Docker:Fejl ved etablering af DB-forbindelse