2010-07-16 21 views
10

Tengo una tabla con 2 fechas: ADDDATE y UPDATEDATE.
Cuando se agrega un elemento, ADDDATE es la fecha actual y UPDATEDATE es 0000-00-00.Mysql ordena elementos por la más reciente de 2 fechas

necesito ORDER BY el comando SQL y obtener la mejor fecha de los 2.
Por ejemplo, si ADD = 12/1/2010 y ACTUALIZACIÓN = 30/6/2010 la fecha de actualización es mejor (el más reciente) .

¿Algún consejo?

Respuesta

18

Uso GREATEST para encontrar la fecha más reciente:

ORDER BY GREATEST(UPDATEDATE, ADDDATE) 
+0

Solo un consejo para las personas que tuvieron el problema que tuve, si necesita comparar una fecha y una fecha de MySQL, también puede hacer PEDIR POR MAYOR (ADDDATE, FROM_UNIXTIME (ACTUALIZADO)) – Jdahern

9
ORDER BY IF(UPDATEDATE > ADDDATE, UPDATEDATE, ADDDATE) 
+0

Esto funciona mejor que GREATEST cuando son posibles valores NULL y desea que se devuelva el valor no nulo. – MD004

6

Si desea hacer su base de datos escalable, lo mejor será añadir una nueva columna LATESTDATE junto con un desencadenador de inserción/actualización que establece eso en el último de los dos campos candidatos usando, por ejemplo, greatest.

La ejecución de las funciones por fila en sus selecciones se ralentiza a medida que la mesa crece. Si desea que el rendimiento se mantenga viable a medida que la mesa crece, este tipo de truco es común.

Viola técnicamente 3NF ya que duplica una de las fechas pero la violación está bien por razones de rendimiento y aún mantiene las propiedades ACID porque los desencadenantes dictan que las columnas permanezcan consistentes.

No sé la sintaxis MySQL gatillo de la parte superior de mi cabeza (yo soy un hombre de DB2 yo) pero me gustaría hacer lo siguiente:

  • crear la nueva columna, ajustarlo a una valor por defecto adecuado.
  • Crea los disparadores de inserción/actualización para garantizar que los cambios se reflejarán.
  • Toque todas las filas con una consulta como update TBL set ADDDATE = ADDDATE para que el desencadenador se active para todas las filas actuales.

La ventaja de esta solución es que mueve el costo del cálculo al momento en que los datos cambian, no cada vez que consulta la base de datos. Esto amortiza el costo en todas las lecturas, haciéndolo más eficiente (a menos que seas una de esas raras bestias donde la tabla está escrita más a menudo que la que se lee).

Tenga en cuenta que esto puede no ser necesario si el tamaño de la mesa es relativamente pequeño: trabajo en entornos donde las mesas son realmente enormes.

+0

nice techique.Gracias – ntan

Cuestiones relacionadas