resueltos - formato fecha mysql español
Formato de fecha y aclaración de consulta SQL (2)
Parte 0). Parece que estás haciendo una operación dateAdd (). Los botones Enviar no necesitan estar en un <cfinput>
Parte 1). etiqueta en <cfinput>
solo funciona en formularios Flash? Si está utilizando formularios Flash que deberían haber sido parte de la pregunta
Parte 2). Este código está abierto a ataques de inyección SQL. Use <cfqueryparam>
Parte 3). <cfqueryparam>
se ocupa de esa preocupación también.
Considere el siguiente fragmento de código (en el contexto de mi tema anterior Jugando con el rango de fechas en ColdFusion 8 ).
<cfparam name="Form.startdate" default="#dateformat(now()-5, ''mm/dd/yyyy'')#">
<cfparam name="Form.enddate" default="#dateformat(now()-1, ''mm/dd/yyyy'')#">
<cfparam name="Form.selectdate" default="#dateformat(now(), ''mm/dd/yyyy'')#">
<cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">
<cfinput type="dateField" name="enddate" label="End Date" width="100" value="#Form.enddate#">
<cfinput name="submit" type="submit" value = "Apply">
<cfinput name="cancel" type="submit" value="Download CSV">
Tengo las siguientes preguntas:
1) Cuando el usuario seleccione una fecha (fecha de inicio) del calendario, ¿la fecha pasará automáticamente al campo "valor" de la siguiente línea?
<cfinput type="dateField" name="startdate" label="Start Date" width="100" value="#Form.startdate#">
Si lo anterior es cierto, entonces creo que se aplicará lo mismo con la fecha de finalización.
2) Respecto a la consulta SQL:
Supongamos que estoy escribiendo la siguiente consulta (tenga en cuenta que "fecha actualizada" es el nombre de la columna desde la que voy a tirar de la "fecha de inicio" y "fecha final"):
<cfquery datasource = "XX.XX.X.XX" name="qMyDatabase">
SELECT(SELECT count(*) FROM MyDatabase) AS TOTAL_CONNECTIONS,
(SELECT count(*) FROM MyDatabase WHERE event_vc = "OPEN" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate# ) AS OPEN_CONNECTIONS,
(SELECT count(*)FROM MyDatabase WHERE event_vc = "BOUNCE" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#) AS BOUNCE_CONNECTIONS,
(SELECT count(*) from MyDatabase where event_vc = "DEFERRED" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#) AS DEFERRED_CONNECTIONS,
(SELECT count(*) from MyDatabase where event_vc = "DELIVERED" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#) AS DELIVERED_CONNECTIONS,
(SELECT count(*) from MyDatabase where event_vc = "DROPPED" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#) AS DROPPED_CONNECTIONS,
(SELECT count(*) from MyDatabase where event_vc = "PROCESSED" AND UpdatedDate BETWEEN #Form.startdate# AND #Form.enddate#) AS PROCESSED_CONNECTIONS,
(ROUND((SELECT OPEN_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "OPEN",
(ROUND((SELECT DEFERRED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DEFERRED",
(ROUND((SELECT DELIVERED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DELIVERED", (ROUND((SELECT DROPPED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "DROPPED", (ROUND((SELECT PROCESSED_CONNECTIONS / (TOTAL_CONNECTIONS))*100)) AS "PROCESSED";
</cfquery>
Por favor, avíseme si la consulta anterior parece ser correcta.
3) En cuanto al formato de fecha.
Como mencioné anteriormente, estoy usando la máscara
mm / dd / aaaa
arriba, mientras que la columna (Fecha actualizada) en mi base de datos usa un formato diferente
(AAAA / MM / DD HH: MI: SS)
. ¿Va a crear algún problema?
Esa es una gran cantidad de preguntas para un hilo ... pero intentaré abordar la mayoría de ellas. (La primera pregunta que puede contestar usted mismo, solo intentándolo ;-)
En cuanto a la consulta, incluso si se ejecutó sin error, se puede mejorar. No voy a volver a escribir la consulta por usted, pero aquí están 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 crítico en una aplicación web.Segundo, está pasando cadenas de fecha . Las cadenas de fechas son ambiguas y pueden malinterpretarse, según el formato y la herramienta que realiza el análisis sintáctico. Es mucho mejor usar objetos de fecha en su lugar. Una forma de hacerlo es mediante el uso de
cfqueryparam
y uno de los tipos de fecha:cf_sql_date
(fecha solamente) ocf_sql_timestamp
(fecha y hora).¡Tercero, como mencioné en su otro hilo , realmente necesita simplificar su consulta! Que muchas subconsultas ya son difíciles de manejar ... agregar filtros de fecha a cada subconsulta lo hace francamente inmanejable. Recomendaría buscar formas de simplificarlo. La sugerencia de Ed ofrecía una posibilidad, reduciéndola a una única
JOIN
y algunas llamadas a funciones.
la columna (Fecha actualizada) usa
YYYY/MM/DD HH:MI:SS
Bueno, en realidad, así es como tu IDE lo muestra a los humanos. Realmente no está almacenado de esa manera. Internamente, las fechas se almacenan como números grandes. Sin embargo, su consulta necesita tener en cuenta el hecho de que su columna almacena una fecha y hora.
Digamos que quería recuperar todos los registros fechados en junio:
form.startDate = "06/01/2013"
form.endDate = "06/30/2013"
Conceptualmente, necesitarías una expresión sql como esta:
WHERE column BETWEEN ''06/01/2013 at midnight'' AND ''06/30/2013 11:59:59 PM''
Sin embargo, la construcción de esos valores de fecha / hora es un poco klunky IMO. Una forma más simple de manejarlo es usar 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">
Al agregar un día a form.endDate
y al usar una <
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 expresión BETWEEN anterior.