Mysql
 sql >> база данни >  >> RDS >> Mysql

Формат на датата и изясняване на SQL заявката

Това са много въпроси за една тема .. но ще се опитам да отговоря на повечето от тях. (Първият въпрос, на който можете да си отговорите, просто като го опитате;-)

Що се отнася до заявката, дори и да работи без грешка - може да се подобри. Няма да пренаписвам заявката вместо вас, но ето основните проблеми

  • Първо,никога използвайте необработени клиентски стойности директно в SQL. Винаги използвайте cfqueryparam за защита срещу sql инжекция. Има и други предимства, но това е от решаващо значение за уеб приложение.

  • Второ, предавате низове за дата . Низовете за дата са двусмислени и могат да бъдат тълкувани погрешно, в зависимост от формата и инструмента, извършващ синтактичния анализ. Много по-добре е да използвате обекти с дата вместо. Един от начините да направите това е като използвате cfqueryparam и един от типовете дата:cf_sql_date (само дата) или cf_sql_timestamp (дата и час).

  • Трето, както споменах в другата ви нишка , наистина трябва да опростите заявката си! Това много подзаявки вече е тромаво .. добавянето на филтри за дата към всяка подзаявка я прави направо неуправляема. Бих препоръчал да разгледате начини да го опростите. Предложение на Ед предлага една възможност, като я сведе до един JOIN и няколко извиквания на функции.

Всъщност точно така показва вашата IDE то на хората. Всъщност не се съхранява по този начин. Вътрешно датите се съхраняват като големи числа. Въпреки това, вашата заявка трябва да отчита факта, че колоната ви съхранява дата и време.

Да речем, че искате да извлечете всички записи с дата през юни:

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

Концептуално ще ви е необходим sql израз като този:

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

Въпреки това, конструирането на тези стойности за дата/час е малко тъпо IMO. По-прост начин за справяне е използването на тази парадигма:

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

Вашият действителен филтър за заявки би изглеждал така:

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

Като добавите един ден към form.endDate и с помощта на < сравнение, получената заявка е:

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

Това ще доведе до точно същите резултати като по-ранния израз 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. Брояч на посетителите на Laravel

  2. SQL:Повторете ред с резултати няколко пъти и номерирайте редовете

  3. Стойност по подразбиране на MySQL въз основа на изглед

  4. Как да добавите колона за автоматично увеличение в съществуваща таблица в MySQL

  5. Разлики между база данни и схема при използване на различни бази данни?