Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erläuterung des Datumsformats und der SQL-Abfrage

Das sind viele Fragen für einen Thread ... aber ich werde versuchen, die meisten davon zu beantworten. (Die erste Frage kannst du dir selbst beantworten, indem du es einfach ausprobierst;-)

Was die Abfrage betrifft, auch wenn sie ohne Fehler lief - sie ist verbesserungswürdig. Ich werde die Abfrage nicht für Sie umschreiben, aber hier sind die Hauptprobleme

  • Erstens, nie Client-Rohwerte direkt in SQL verwenden. Verwenden Sie immer cfqueryparam zum Schutz vor SQL-Injection. Es hat auch andere Vorteile, aber dieser ist in einer Webanwendung entscheidend.

  • Zweitens übergeben Sie Datumszeichenfolgen . Datumszeichenfolgen sind mehrdeutig und können je nach Format und Tool, das die Analyse durchführt, falsch interpretiert werden. Es ist viel besser, datierte Objekte zu verwenden stattdessen. Eine Möglichkeit dazu ist die Verwendung von cfqueryparam und einen der Datumstypen:cf_sql_date (nur Datum) oder cf_sql_timestamp (Datum (und Uhrzeit).

  • Drittens, wie ich in Ihrem anderen Thread erwähnt habe , müssen Sie Ihre Abfrage wirklich vereinfachen! So viele Unterabfragen sind schon unhandlich. Das Hinzufügen von Datumsfiltern zu jeder Unterabfrage macht es geradezu unhandlich. Ich würde empfehlen, nach Möglichkeiten zu suchen, um es zu vereinfachen. Eds Vorschlag bot eine Möglichkeit, indem es auf ein einziges JOIN reduziert wurde und ein paar Funktionsaufrufe.

Nun, genau so wird Ihre IDE angezeigt es den Menschen. Es wird nicht wirklich so gespeichert. Intern werden Datumsangaben als große Zahlen gespeichert. Ihre Abfrage muss jedoch berücksichtigen, dass Ihre Spalte ein Datum und speichert Zeit.

Angenommen, Sie wollten alle Datensätze mit Datum abrufen im Juni:

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

Konzeptionell benötigen Sie einen SQL-Ausdruck wie diesen:

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

Das Konstruieren dieser Datums-/Uhrzeitwerte ist meiner Meinung nach jedoch etwas umständlich. Ein einfacherer Weg, damit umzugehen, ist die Verwendung dieses Paradigmas:

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

Ihr tatsächlicher Abfragefilter würde in etwa so aussehen:

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

Durch Hinzufügen eines Tages zu form.endDate , und verwenden Sie einen < Vergleich, die resultierende Abfrage lautet:

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

Dies führt zu exakt denselben Ergebnissen wie der frühere BETWEEN-Ausdruck.