sql >> Base de Datos >  >> RDS >> Mysql

Formato de fecha y aclaración de consulta SQL

Esas son muchas preguntas para un hilo ... pero intentaré abordar la mayoría de ellas. (La primera pregunta la puedes responder tú mismo, simplemente intentándolo;-)

En cuanto a la consulta, incluso si se ejecutó sin errores, se puede mejorar. No voy a volver a escribir la consulta por usted, pero estos son los principales problemas

  • Primero, nunca use valores de cliente sin procesar directamente en SQL. Utilice siempre cfqueryparam para proteger contra la inyección sql. También tiene otros beneficios, pero ese es fundamental en una aplicación web.

  • En segundo lugar, está pasando cadenas de fecha . Las cadenas de fecha son ambiguas y se pueden malinterpretar, según el formato y la herramienta que realiza el análisis. Es mucho mejor usar fecha objetos en cambio. Una forma de hacerlo es usando cfqueryparam y uno de los tipos de fecha:cf_sql_date (solo fecha) o cf_sql_timestamp (fecha y hora).

  • En tercer lugar, como mencioné en su otro hilo , ¡realmente necesitas simplificar tu consulta! Tantas subconsultas ya son difíciles de manejar... agregar filtros de fecha a cada subconsulta lo hace francamente inmanejable. Recomendaría buscar formas de simplificarlo. Sugerencia de Ed ofreció una posibilidad, reduciéndola a un solo JOIN y algunas llamadas de función.

Bueno, en realidad así es como su IDE muestra a los humanos. Realmente no se almacena de esa manera. Internamente, las fechas se almacenan como números grandes. Sin embargo, su consulta debe tener en cuenta el hecho de que su columna almacena una fecha y tiempo.

Digamos que desea recuperar todos los registros fechados en junio:

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

Conceptualmente, necesitaría una expresión sql como esta:

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

Sin embargo, construir esos valores de fecha/hora es un poco torpe en mi opinión. Una forma más sencilla de manejarlo es usando este paradigma:

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

Su filtro de consulta real se vería así:

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

Agregando un día a form.endDate y usando un < comparación, la consulta resultante es:

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

Esto producirá exactamente los mismos resultados que la anterior expresión BETWEEN.