Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/03/2010, 11:47
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con consulta super complicada y fechas

Los valores constantes de fechas u horas deben ser escritos entre apóstrofes, para que sean reconocidos como tales, o de lo contrario se tomarán como operaciones aritméticas.
Esto:
Código MySQL:
Ver original
  1.   TSS.idsubserie,
  2.   md,
  3.   TSS.codigo,
  4.   TSS.nombre,
  5.   TS.codigo codigoserie,
  6.   TS.nombre nombreserie,
  7.   UA.codigo codigounidad,
  8.   TPS.nombre tiposerie,
  9.   valor_documental,
  10.   retencion_agestion,
  11.   retencion_acentral,
  12.   disposicion_final,
  13.   proc_disposicion_final,
  14.   MIN(YEAR(fechae_inicial)) ainicial,
  15.   MAX(YEAR(fechae_final)) afinal
  16. FROM t_tabla_retencion_documental TRD
  17.       INNER JOIN trd_subseries TSS
  18.         ON TSS.idsubserie = TRD.idsubserie
  19.       LEFT OUTER JOIN trd_series TS
  20.         ON TS.idserie = TSS.idserie
  21.         AND TS.idserie = TRD.idserie
  22.       LEFT OUTER JOIN trd_unidades_administrativas UA
  23.         ON UA.idunidadadm = TSS.idunidadadministrativa
  24.       LEFT OUTER JOIN trd_tipos_serie TPS
  25.         ON TS.idtiposerie = TPS.idtiposerie
  26.   UA.idunidadadm = 40
  27.   AND TRD.fechae_inicial BETWEEN 2007-01-01 AND 2009-01-01
  28.       GROUP BY TSS.idserie, TSS.idsubserie;
En realidad MySQL lo interpreta:
Código MySQL:
Ver original
  1.   TSS.idsubserie,
  2.   md,
  3.   TSS.codigo,
  4.   TSS.nombre,
  5.   TS.codigo codigoserie,
  6.   TS.nombre nombreserie,
  7.   UA.codigo codigounidad,
  8.   TPS.nombre tiposerie,
  9.   valor_documental,
  10.   retencion_agestion,
  11.   retencion_acentral,
  12.   disposicion_final,
  13.   proc_disposicion_final,
  14.   MIN(YEAR(fechae_inicial)) ainicial,
  15.   MAX(YEAR(fechae_final)) afinal
  16. FROM t_tabla_retencion_documental TRD
  17.       INNER JOIN trd_subseries TSS
  18.         ON TSS.idsubserie = TRD.idsubserie
  19.       LEFT OUTER JOIN trd_series TS
  20.         ON TS.idserie = TSS.idserie
  21.         AND TS.idserie = TRD.idserie
  22.       LEFT OUTER JOIN trd_unidades_administrativas UA
  23.         ON UA.idunidadadm = TSS.idunidadadministrativa
  24.       LEFT OUTER JOIN trd_tipos_serie TPS
  25.         ON TS.idtiposerie = TPS.idtiposerie
  26.   UA.idunidadadm = 40
  27.   AND TRD.fechae_inicial BETWEEN 2005 AND 2007
  28.       GROUP BY TSS.idserie, TSS.idsubserie;

Debe ir:
Código MySQL:
Ver original
  1.   TSS.idsubserie,
  2.   md,
  3.   TSS.codigo,
  4.   TSS.nombre,
  5.   TS.codigo codigoserie,
  6.   TS.nombre nombreserie,
  7.   UA.codigo codigounidad,
  8.   TPS.nombre tiposerie,
  9.   valor_documental,
  10.   retencion_agestion,
  11.   retencion_acentral,
  12.   disposicion_final,
  13.   proc_disposicion_final,
  14.   MIN(YEAR(fechae_inicial)) ainicial,
  15.   MAX(YEAR(fechae_final)) afinal
  16. FROM t_tabla_retencion_documental TRD
  17.       INNER JOIN trd_subseries TSS
  18.         ON TSS.idsubserie = TRD.idsubserie
  19.       LEFT OUTER JOIN trd_series TS
  20.         ON TS.idserie = TSS.idserie
  21.         AND TS.idserie = TRD.idserie
  22.       LEFT OUTER JOIN trd_unidades_administrativas UA
  23.         ON UA.idunidadadm = TSS.idunidadadministrativa
  24.       LEFT OUTER JOIN trd_tipos_serie TPS
  25.         ON TS.idtiposerie = TPS.idtiposerie
  26.   UA.idunidadadm = 40
  27.   AND TRD.fechae_inicial BETWEEN '2007-01-01' AND '2009-01-01'
  28.       GROUP BY TSS.idserie, TSS.idsubserie;
Además, nunca te olvides que el AND hace que las condiciones se deben cumplir al mismo tiempo, y si la fecha cumple la condición, pero el idunidadadm fuese 39, por ejemplo, el registro no saldrá porque no cumple con ambas.

Tip: Los AS son innecesarios desde hace años.
Tip 2: Usa alias en los nombres de tablas. Simplifica la lectura de las sentencias.
Tip 3: Trata de escribir estructurado, de esa forma se vuelve más sencillo entender la sentencia y se ven mejor los errores.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)