Você está na página 1de 4

MySQL 5.0 Reference Manual :: 3 Curso (tutorial) de MySQL :: 3.3 Crear y utilizar una base de datos :: 3.3.

4 Extraer informacin de una tabla :: 3.3.4.5 Clculos sobre fechas

3.3.4.5. Clculos sobre fechas


MySQL provee varias funciones que se aplican a clculos entre fechas, por ejemplo, para calcular edades u obtener partes de una fecha. Para determinar cuntos aos de edad tiene cada mascota, hay que calcular la diferencia entre el ao de la fecha actual y el de la fecha de nacimiento, y luego restar 1 al resultado si el dia y mes actuales son anteriores al da y mes indicados por la fecha de nacimiento. La siguiente consulta devuelve, para cada mascota, el nombre, la fecha de nacimiento, la fecha actual, y la edad en aos.
m y s q l >S E L E C Tn a m e ,b i r t h ,C U R D A T E ( ) , >( Y E A R ( C U R D A T E ( ) ) Y E A R ( b i r t h ) ) >-( R I G H T ( C U R D A T E ( ) , 5 ) < R I G H T ( b i r t h , 5 ) ) >A Sa g e >F R O Mp e t ; + + + + + |n a m e |F l u f f y |C l a w s |B u f f y |F a n g |B o w s e r |C h i r p y |S l i m |b i r t h |C U R D A T E ( ) |a g e | 1 0| 9| 1 4| 1 2| 1 3| 4| 5| 7| 4| + + + + + |1 9 9 3 0 2 0 4|2 0 0 3 0 8 1 9| |1 9 9 4 0 3 1 7|2 0 0 3 0 8 1 9| |1 9 8 9 0 5 1 3|2 0 0 3 0 8 1 9| |1 9 9 0 0 8 2 7|2 0 0 3 0 8 1 9| |1 9 8 9 0 8 3 1|2 0 0 3 0 8 1 9| |1 9 9 8 0 9 1 1|2 0 0 3 0 8 1 9| |1 9 9 6 0 4 2 9|2 0 0 3 0 8 1 9|

3.3.4.4 Ordenar registros 3.3.4.6 Trabajar con valores NULL

Section Navigation

[Toggle]

3.3.4 Extraer informacin de una tabla 3.3.4.1 Seleccionar todos los datos 3.3.4.2 Seleccionar registros especficos 3.3.4.3 Seleccionar columnas concretas 3.3.4.4 Ordenar registros 3.3.4.5 Clculos sobre fechas 3.3.4.6 Trabajar con valores NULL 3.3.4.7 Coincidencia de patrones 3.3.4.8 Contar registros 3.3.4.9 Utilizar ms de una tabla

|W h i s t l e r|1 9 9 7 1 2 0 9|2 0 0 3 0 8 1 9| |P u f f b a l l|1 9 9 9 0 3 3 0|2 0 0 3 0 8 1 9|

+ + + + +

En el ejemplo anterior, Y E A R ( )trae la parte correspondiente al ao de una fecha, y R I G H T ( )trae los 5 primeros caracteres contando desde la derecha, que representan la parte M M D Dde la fecha. La porcin de la expresin que compara los valores M M D Ddevuelve 1 o 0, lo cual se corresponde con la diferencia de 1 ao a restar de la edad si el dia de la fecha devuelto por C U R D A T E ( )ocurre antes que la fecha de nacimiento b i r t h . La expresin completa es un tanto confusa para usar como encabezado, por lo que se emplea un alias (a g e ) para que el encabezado sea ms comprensible. La consulta funciona bien, pero los resultados podran revisarse ms fcilmente si las filas se presentaran en algn orden. Esto puede hacerse agregando la clusula O R D E RB Yn a m epara ordenar por nombre la salida:
m y s q l >S E L E C Tn a m e ,b i r t h ,C U R D A T E ( ) , >( Y E A R ( C U R D A T E ( ) ) Y E A R ( b i r t h ) )

>-( R I G H T ( C U R D A T E ( ) , 5 ) < R I G H T ( b i r t h , 5 ) ) >A Sa g e >F R O Mp e tO R D E RB Yn a m e ; + + + + + |n a m e |B o w s e r |B u f f y |C h i r p y |C l a w s |F a n g |F l u f f y |S l i m |b i r t h |C U R D A T E ( ) |a g e | 1 3| 1 4| 4| 9| 1 2| 1 0| 4| 7| 5| + + + + + |1 9 8 9 0 8 3 1|2 0 0 3 0 8 1 9| |1 9 8 9 0 5 1 3|2 0 0 3 0 8 1 9| |1 9 9 8 0 9 1 1|2 0 0 3 0 8 1 9| |1 9 9 4 0 3 1 7|2 0 0 3 0 8 1 9| |1 9 9 0 0 8 2 7|2 0 0 3 0 8 1 9| |1 9 9 3 0 2 0 4|2 0 0 3 0 8 1 9| |1 9 9 6 0 4 2 9|2 0 0 3 0 8 1 9|

|P u f f b a l l|1 9 9 9 0 3 3 0|2 0 0 3 0 8 1 9| |W h i s t l e r|1 9 9 7 1 2 0 9|2 0 0 3 0 8 1 9|

+ + + + +

Para ordenar la salida por edad (a g e ) en lugar de por nombre (n a m e ), solo hay que utilizar una clusula O R D E RB Ydiferente:
m y s q l >S E L E C Tn a m e ,b i r t h ,C U R D A T E ( ) , >( Y E A R ( C U R D A T E ( ) ) Y E A R ( b i r t h ) ) >-( R I G H T ( C U R D A T E ( ) , 5 ) < R I G H T ( b i r t h , 5 ) ) >A Sa g e >F R O Mp e tO R D E RB Ya g e ; + + + + + |n a m e |C h i r p y |b i r t h |C U R D A T E ( ) |a g e | 4| 4| 5| 7| 9| 1 0| 1 2| 1 3| 1 4| + + + + + |1 9 9 8 0 9 1 1|2 0 0 3 0 8 1 9| |P u f f b a l l|1 9 9 9 0 3 3 0|2 0 0 3 0 8 1 9| |W h i s t l e r|1 9 9 7 1 2 0 9|2 0 0 3 0 8 1 9| |S l i m |C l a w s |F l u f f y |F a n g |B o w s e r |B u f f y |1 9 9 6 0 4 2 9|2 0 0 3 0 8 1 9| |1 9 9 4 0 3 1 7|2 0 0 3 0 8 1 9| |1 9 9 3 0 2 0 4|2 0 0 3 0 8 1 9| |1 9 9 0 0 8 2 7|2 0 0 3 0 8 1 9| |1 9 8 9 0 8 3 1|2 0 0 3 0 8 1 9| |1 9 8 9 0 5 1 3|2 0 0 3 0 8 1 9|

+ + + + +

Una consulta similar se utiliza para determinar la edad a la fecha de muerte de los animales. Se determinan los animales que han muerto verificando si el valor de la columna d e a t hes N U L L . Entonces, para todos los valores no N U L Lcalcula la diferencia entre las fechas de muerte (d e a t h ) y nacimiento (b i r t h ):
m y s q l >S E L E C Tn a m e ,b i r t h ,d e a t h , >( Y E A R ( d e a t h ) Y E A R ( b i r t h ) )-( R I G H T ( d e a t h , 5 ) < R I G H T ( b i r t h , 5 ) ) >A Sa g e

>F R O Mp e tW H E R Ed e a t hI SN O TN U L LO R D E RB Ya g e ; + + + + + |n a m e |b i r t h |d e a t h |a g e | 5| + + + + + |B o w s e r|1 9 8 9 0 8 3 1|1 9 9 5 0 7 2 9| + + + + +

La consulta utiliza la expresin d e a t hI SN O TN U L Len lugar de d e a t h< >N U L Lporque N U L Les un valor especial, que no puede ser comparado mediante los operadores lgicos habituales. Este tema se trata ms extensamente ms adelante. Consultar Seccin 3.3.4.6, Trabajar con valores N U L L . Qu tal si se quisiera saber qu animales cumplen aos el prximo mes? Para esta clase de clculos, el ao y el da son irrelevantes; simplemente se desea extraer de la columna b i r t hla parte correspondiente al mes. MySQL cuenta con varias funciones para extraer partes de fechas, como Y E A R ( ) ,M O N T H ( ) ,y D A Y O F M O N T H ( ) .M O N T H ( )es la funcin apropiada para este caso. Para verla en funcionamiento, ejecute una consulta que muestra tanto el valor de b i r t hcomo el de M O N T H ( b i r t h ) :
m y s q l >S E L E C Tn a m e ,b i r t h ,M O N T H ( b i r t h )F R O Mp e t ; + + + + |n a m e |F l u f f y |C l a w s |B u f f y |F a n g |B o w s e r |C h i r p y |S l i m |b i r t h |M O N T H ( b i r t h )| 2| 3| 5| 8| 8| 9| 1 2| 4| 3| + + + + |1 9 9 3 0 2 0 4| |1 9 9 4 0 3 1 7| |1 9 8 9 0 5 1 3| |1 9 9 0 0 8 2 7| |1 9 8 9 0 8 3 1| |1 9 9 8 0 9 1 1| |1 9 9 6 0 4 2 9|

|W h i s t l e r|1 9 9 7 1 2 0 9| |P u f f b a l l|1 9 9 9 0 3 3 0|

+ + + +

Encontrar los animales que cumplen aos el mes siguiente es tambin sencillo. Suponga que el mes actual es abril. De modo que su nmero es 4 , y se buscan los animales nacidos en Mayo (mes 5 ), de esta forma:
m y s q l >S E L E C Tn a m e ,b i r t hF R O Mp e tW H E R EM O N T H ( b i r t h )=5 ; + + + |n a m e |b i r t h | + + + |B u f f y|1 9 8 9 0 5 1 3| + + +

Esto se complica ligeramente cuando el mes actual es Diciembre. No se puede simplemente sumarle 1 al nmero del mes (1 2 ) y buscar animales nacidos en el mes 1 3 , porque no existe tal mes. En lugar de eso, se debe buscar por animales nacidos en Enero (mes 1 ). Se puede incluso escribir la consulta de forma que funcione sin importar cual es el mes actual. As, no se necesitar indicar un mes en particular en la consulta. D A T E _ A D D ( )sirve para sumar un intervalo de tiempo a una fecha dada. Si se adiciona un mes al valor de C U R D A T E ( ) , y se extrae el mes mediante

M O N T H ( ) , el resultado ser el mes en el que se buscarn cumpleaos: m y s q l >S E L E C Tn a m e ,b i r t hF R O Mp e t >W H E R EM O N T H ( b i r t h )=M O N T H ( D A T E _ A D D ( C U R D A T E ( ) , I N T E R V A L1M O N T H ) ) ;

Una manera alternativa de alcanzar el mismo resultado es sumar 1al mes actual para obtener el mes siguiente (despus de emplear la funcin mdulo (M O D ) para dejar el nmero de mes en 0si resultara ser 1 2 :
m y s q l >S E L E C Tn a m e ,b i r t hF R O Mp e t >W H E R EM O N T H ( b i r t h )=M O D ( M O N T H ( C U R D A T E ( ) ) ,1 2 )+1 ;

Advierta que M O N T Hdevuelve un nmero entre 1y 1 2 .YM O D ( a l g u n _ v a l o r , 1 2 )devuelve un nmero entre 0y 1 1 . La suma debe ser realizada despus de M O D ( ) , en otro caso se estara pasando de Noviembre (1 1 ) a Enero (1 ). sta es una traduccin del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL est escrito en ingls, y esta traduccin no necesariamente est tan actualizada como la versin original. Para cualquier sugerencia sobre la traduccin y para sealar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
Copyright 1997, 2011, Oracle and/or its affiliates. All rights reserved. Legal Notices

Top / Previous / Next / Up / Table of Contents 2013, Oracle Corporation and/or its affiliates

Você também pode gostar