Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Doble filtrado de fechas

Estas en el tema de Doble filtrado de fechas en el foro de Mysql en Foros del Web. Hola a tod@s y gracias de antemano por la ayuda. Tengo una tabla con un campo fecha y quiero hacer lo siguiente: Los registros que ...
  #1 (permalink)  
Antiguo 16/05/2008, 11:36
 
Fecha de Ingreso: noviembre-2003
Ubicación: alicante
Mensajes: 44
Antigüedad: 20 años, 5 meses
Puntos: 2
Doble filtrado de fechas

Hola a tod@s y gracias de antemano por la ayuda.
Tengo una tabla con un campo fecha y quiero hacer lo siguiente:
Los registros que tengan fecha <>'0000-00-00' sacarlos ordenados de mas antiguo a mas nuevo, y una vez se hayan acabado estos registros continuar mostrando los que tienen fecha ='0000-00-00'.

Tengo este trozo de código ORDER BY fecha <>'0000-00-00' ASC pero saca todos los registros empezando por los que tienen fecha='0000-00-00'.

Me he quedado atascado y no sé como hacer lo que comento.

Gracias y saludos
  #2 (permalink)  
Antiguo 18/05/2008, 14:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Doble filtrado de fechas

Intenta un if(fecha='0000-00-00','9999-12-31',fecha) para ordenar....

Quim
  #3 (permalink)  
Antiguo 18/05/2008, 17:12
Avatar de 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: Doble filtrado de fechas

Un detalle:
Si el campo FECHA tiene como valor '0000-00-00' (que representa el NULL de un campo DATE), ¿cómo haces para saber cuál es el más antiguo y cuál el mas reciente de los registros? ¿Tienes algún otro campo DATE, TIME o DATETIME que sirva para saberlo?
El resto es más o menos simple: Primero haces la consulta por la diferencia a '0000-00-00' o con el NULL (por las dudas), ordenándolo por no sé cual campo, y después le haces un UNION ALL con otra consulta que te devuelva el resto.
Algo así como
Código:
SELECT *
FROM
(SELECT * 
FROM tabla
WHERE FECHA  <> '0000-00-00' OR FECHA IS NULL
ORDER BY CampoDesconocido ASC) AS tabla1
UNION ALL
(SELECT * 
FROM tabla
WHERE FECHA = '0000-00-00'
ORDER BY CampoDesconocido ASC) AS tabla2
Tip:
Una consulta que devuelva dos conjuntos unidos, cada uno con su propio ordenamiento DEBE tener en cada subconsulta el ORDER BY, pero la UNION requiere que haya un sólo ORDER BY al final de las selecciones unidas, por lo que para que no genere un error de sintaxis hay que hacerlo como las puse: generar con cada selección una tabla virtual y unirlas ambas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 18/05/2008, 23:38
 
Fecha de Ingreso: noviembre-2003
Ubicación: alicante
Mensajes: 44
Antigüedad: 20 años, 5 meses
Puntos: 2
Respuesta: Doble filtrado de fechas

Gracias a todos por contestar.

Para gnzsoloyo:
Mira la cuestion es que la base de datos. es una base dedatos comprada que viene ya con toda una serie de registros y yo al modificarlos les cambio la fecha.

Tu solución me parece acertada, así es que voy a ponerme manos a la obra.

Gracias de nuevo, sois unos cracks
  #5 (permalink)  
Antiguo 19/05/2008, 02:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Doble filtrado de fechas

Cuidado con esa solució...
de la ayuda de Mysql
Cita:
To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows. If ORDER BY appears with LIMIT, it is used to determine the subset of the selected rows to retrieve for the SELECT, but does not necessarily affect the order of those rows in the final UNION result. If ORDER BY appears without LIMIT in a SELECT, it is optimized away because it will have no effect anyway.

To cause rows in a UNION result to consist of the sets of rows retrieved by each SELECT one after the other, select an additional column in each SELECT to use as a sort column and add an ORDER BY following the last SELECT:

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;
To additionally maintain sort order within individual SELECT results, add a secondary column to the ORDER BY clause:

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;
Insisto con el condicional, si quieres se puede complementar con el null

Select `fecha`, if(fecha='0000-00-00' or fecha is null,'9999-12-31',fecha) as `orden` from tabla order by if(fecha='0000-00-00' or fecha is null,'9999-12-31',fecha);

Luego en la salida muestras fecha y listos....


Quim
  #6 (permalink)  
Antiguo 19/05/2008, 05:12
Avatar de 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: Doble filtrado de fechas

Buena observación, pero yo no estoy hablando de un caso así:
Código:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
sino así:
Código:
SELECT * 
FROM 
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
AS T1
UNION
SELECT * 
FROM 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
AS T2;
No estoy uniendo dos select ordenados, sino dos select que se originan en tablas virtuales creadas por subconsultas. Las restricciones del manual no operan en este caso, porque la tabla unida es la virtual, no la física.
Esto ya lo he implementado en varias ocasiones, y se positivamente que funciona.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 19/05/2008, 06:00
 
Fecha de Ingreso: noviembre-2003
Ubicación: alicante
Mensajes: 44
Antigüedad: 20 años, 5 meses
Puntos: 2
Respuesta: Doble filtrado de fechas

Hola
La solución que he adoptado y que por las pruebas que he realizado funciona es

( SELECT * FROM A WHERE `B` >0 AND `fecha_alta`<>'0000-00-00' ORDER BY `fecha_alta` ASC)
UNION ALL
(SELECT * FROM `A` WHERE `B` >0 AND fecha_alta='0000-00-00' ORDER BY `B` ASC ) LIMIT $inicio, $final

De esta manera funciona.
En el primer SELECT coloca los que son distintos de "0000-00-0" y en el segundo los que son iguales.
He estado probando la paginación y funciona de cine.
Si se os ocurre alguna mejora, adelante.

Gracias por vuestro interés
Pepe Sendra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:16.