2011-09-18 17 views
8

FIJO - esto es lo que tengo ahora - Escrito en ASPMySQL Fecha Entre

If Session("dateRange") = "Today" Then 
     fromDate = Date() 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated = '"&fromDate&"' " 
ElseIf Session("dateRange") = "Yesterday" Then 
     fromDate = DateAdd("d",-1,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated = '"&fromDate&"' " 
ElseIf Session("dateRange") = "1 Week" Then 
     fromDate = DateAdd("d",-7,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
ElseIf Session("dateRange") = "1 Month" Then 
     fromDate = DateAdd("m",-1,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
ElseIf Session("dateRange") = "3 Months" Then 
     fromDate = DateAdd("m",-3,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
ElseIf Session("dateRange") = "6 Months" Then 
     fromDate = DateAdd("m",-6,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
ElseIf Session("dateRange") = "1 Year" Then 
     fromDate = DateAdd("yyyy",-1,Date()) 
     fromDate = Year(fromDate)&"-"&Month(fromDate)&"-"&Day(fromDate) 
     whereClause = whereClause & "AND dateCreated BETWEEN '"&fromDate&"' AND '"&toDate&"' " 
End If 

pregunta original:

pregunta simple, pero por alguna razón me parece que no puede conseguir esto funciona

Tengo un cuadro de búsqueda, junto a un menú de selección de rango de fechas, para que el usuario pueda buscar fotos en los últimos 1 mes, 6 meses o 12 meses.

Lo que tengo no error, pero que no produce resultados cuando se debe hacer, este es el lugar:

WHERE dateCreated BETWEEN "&DateAdd("m",-6,Date())&" AND "&Date()&" 

La salida de SQL produce esto:

dateCreated BETWEEN 18/03/2011 AND 18/09/2011 ORDER BY dateCreated DESC 

La base de datos de campo 'DateCreated' está configurado en (ÍNDICE DE LA VEZ).

¿Alguien puede ver lo que está mal?

+0

¿está seguro de que no hay error? – Mat

+0

Las fechas en su SQL deben citarse con comillas simples. Y el en el formato 'aaaa-mm-dd'. – Asaph

Respuesta

30

Las fechas en su SQL resultante deben citarse con comillas simples. Intente rodear las partes dinámicas de su consulta con comillas. Algo como esto:

WHERE dateCreated BETWEEN '"&DateAdd("m",-6,Date())&"' AND '"&Date()&"' 

que yo supongo que produciría este SQL:

dateCreated BETWEEN '18/03/2011' AND '18/09/2011' ORDER BY dateCreated DESC 

También, ver si se puede encontrar una manera de dar formato a las fechas en el formato más habitual MySQL yyyy-mm-dd. De esta manera:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC 
+1

Gracias Asaph, esto funciona ahora. Mi script de fecha anterior era de una configuración de DB de acceso de "pantalones". Entonces todo lo que hice fue eliminar el pensamiento del "#" que era todo lo que necesitaba hacer. ¡Odio los formatos de fecha y las bases de datos! – TheCarver

0

No está seguro de lo que la tecnología que está utilizando para DateAdd(), pero el formato de fecha final es incorrecto, además del hecho de que sus valores de fecha no están encerrados entre comillas simples.

MySQL compara las fechas como 2011-03-18 no 18/03/2011.

Una nota que puede hacer esto en MySQL con su Date Time Functions. Aunque es puede mantener la consulta de la memoria caché.

0

Si esas cadenas no están entrecomilladas, creo que en realidad solo está haciendo división y luego comparando las fechas entre un marco de tiempo muy pequeño.

2

%d-%m-%Y no es un formato de fecha apropiado y los valores de fecha en MySQL siempre deben citarse cadenas similares y formato ISO 8601 ('%Y-%m-%d'). 18/03/2011 se interpretará como 18 dividido por 03 y 2011 que da aproximadamente 0.002….

Es decir, su SQL debe ser como la siguiente forma en su lugar:

dateCreated BETWEEN '2011-03-18' AND '2011-09-18' ORDER BY dateCreated DESC 
7

Si usted está buscando específicamente hacia atrás desde "ahora", ¿por qué no hacer

where DateCreated >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
where DateCreated >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) 
where DateCreated >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) 

No hay necesidad de un "rango", basta con insertar el rango mes posterior desea permitir ...

+0

Bueno, en realidad, no todas las búsquedas usan el 'rango', el usuario puede insertar dos fechas para encontrar un rango más específico ... pero ... si el usuario usa el rango básico, podría construir el SQL solo para eso y si ellos ingresan dos fechas, yo podría construir el SQL solo para eso también porque estoy seguro de que su sugerencia es más rápida para mirar hacia atrás – TheCarver