Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Format daty i wyjaśnienie zapytania SQL

To dużo pytań na jeden wątek.. ale postaram się odpowiedzieć na większość z nich. (Pierwsze pytanie, na które możesz sobie odpowiedzieć, wystarczy spróbować;-)

Jeśli chodzi o zapytanie, nawet jeśli przebiegło bezbłędnie - można je poprawić. Nie będę przepisywać zapytania za Ciebie, ale oto główne problemy

  • Po pierwsze, nigdy używaj surowych wartości klienta bezpośrednio w SQL. Zawsze używaj cfqueryparam do ochrony przed wstrzyknięciem sql. Ma też inne zalety, ale ta jest krytyczna w aplikacji internetowej.

  • Po drugie, przekazujesz ciągi dat . Ciągi daty są niejednoznaczne i mogą być błędnie interpretowane, w zależności od formatu i narzędzia przeprowadzającego analizę. O wiele lepiej jest używać daty obiektów zamiast. Jednym ze sposobów na to jest użycie cfqueryparam i jeden z typów dat:cf_sql_date (tylko data) lub cf_sql_timestamp (Data i godzina).

  • Po trzecie, jak wspomniałem w w innym wątku , naprawdę musisz uprościć swoje zapytanie! Tak wiele podzapytań jest już nieporęcznych. Dodanie filtrów dat do każdego podzapytania sprawia, że ​​jest to wręcz niemożliwe do zarządzania. Polecam poszukać sposobów na uproszczenie tego. Sugestia Eda oferował jedną możliwość, redukując ją do pojedynczego JOIN i kilka wywołań funkcji.

Właściwie tak właśnie wyświetla się Twoje IDE to do ludzi. Nie jest tak naprawdę przechowywany. Wewnętrznie daty są przechowywane jako duże liczby. Jednak zapytanie musi uwzględniać fakt, że kolumna zawiera datę i czas.

Załóżmy, że chcesz pobrać wszystkie rekordy datowane w czerwcu:

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

Koncepcyjnie potrzebujesz takiego wyrażenia sql:

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

Jednak konstruowanie tych wartości daty/czasu jest trochę niezręczne w IMO. Prostszym sposobem radzenia sobie z tym jest użycie tego paradygmatu:

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

Twój rzeczywisty filtr zapytań będzie wyglądał mniej więcej tak:

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

Dodając jeden dzień do form.endDate i używając < porównania, wynikowe zapytanie to:

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

Da to dokładnie te same wyniki, co wcześniejsze wyrażenie BETWEEN.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak przywrócić bazę danych w mysql?

  2. Laravel generuje inne dane wyjściowe niż zapytanie MySQL

  3. Najlepsze rozwiązanie dotyczące przechowywania wag w bazie danych SQL?

  4. Funkcja hasła MySQL

  5. Daty nakładające się na MySQL, żadne nie są sprzeczne