sql >> Databáze >  >> RDS >> Mysql

Formát data a objasnění dotazu SQL

To je hodně otázek na jedno vlákno, ale většinu z nich se pokusím vyřešit. (Na první otázku si můžete odpovědět sami, stačí to zkusit;-)

Pokud jde o dotaz, i když běžel bez chyby - lze jej zlepšit. Nehodlám vám přepisovat dotaz, ale zde jsou hlavní problémy

  • Za prvé, nikdy používat nezpracované klientské hodnoty přímo v SQL. Vždy používejte cfqueryparam na ochranu před sql injection. Má také další výhody, ale ta je ve webové aplikaci kritická.

  • Za druhé, předáváte řetězce data . Řetězce data jsou nejednoznačné a mohou být nesprávně interpretovány v závislosti na formátu a nástroji, který analýzu provádí. Je mnohem lepší použít datum objektů namísto. Jedním ze způsobů, jak toho dosáhnout, je použití cfqueryparam a jeden z typů dat:cf_sql_date (pouze datum) nebo cf_sql_timestamp (datum a čas).

  • Zatřetí, jak jsem zmínil v vaše další vlákno , opravdu potřebujete zjednodušit svůj dotaz! Tolik poddotazů je již nepraktické... přidáním datových filtrů do každého poddotazu je naprosto nezvládnutelný. Doporučil bych se podívat na způsoby, jak to zjednodušit. Edův návrh nabídl jednu možnost tím, že ji zredukoval na jediný JOIN a několik volání funkcí.

No ve skutečnosti je to přesně to, jak se vaše IDE zobrazuje to lidem. Ve skutečnosti se takto neukládá. Interně jsou data uložena jako velká čísla. Váš dotaz však musí zohlednit skutečnost, že váš sloupec obsahuje datum a čas.

Řekněme, že chcete načíst všechny záznamy datované v červnu:

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

Koncepčně byste potřebovali sql výraz, jako je tento:

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

Konstrukce těchto hodnot data/času je však IMO trochu neohrabaná. Jednodušší způsob, jak to zvládnout, je použít toto paradigma:

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

Váš skutečný filtr dotazů by vypadal asi takto:

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

Přidáním jednoho dne do form.endDate a pomocí < porovnání, výsledný dotaz je:

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

To poskytne přesně stejné výsledky jako dřívější výraz BETWEEN.



  1. Omezte připojení k serveru SQL na konkrétní IP adresu

  2. Příkaz MySQL Vysvětlete ignorovat LIMIT?

  3. CodeIgniter Select Statement s klauzulí Where

  4. Co je lepší pro velké datové aplikace, SQL nebo NoSQL?