You are on page 1of 7

Manejo de fechas

SELECT como calculadora Se puede usar la clusula SELECT para hacer clculos aritmticos. Ejemplos:
SELECT 1+1; SELECT 4.5*(3.86+2.34)

Se debe usar punto decimal y no coma. Se puede usar la funcin POW ( por power, potencia) para hacer clculos relativos a intereses. POW(a,b) calcula a elevado a la potencia b. Por ejemplo, POW(10,3) produce el valor 1000. Tambin se pueden hacer clculos trigonomtricos, etc, pero, en general, estos clculos no relacionados con bases de datos se hacen mejor con una calculadora.

Clculos con fechas Donde s resulta realmente interesante el poder de clculo de MySQL, es con los clculos relativos a fechas. Para esos clculos, necesitaremos unas cuantas funciones. Para los ejemplos, supondremos que hoy es 1/1/2005. CURDATE(). Esta funcin da la fecha del da (si el sistema tiene la fecha correcta!). Ejemplo:
SELECT CURDATE();

Obtenemos 2005-01-01, en el formato de fecha Ao-Mes-Da propio de MySQL. DAYNAME(). Dada una fecha, esta funcin da el nombe ( en ingls) del da de la semana correspondiente. Ejemplo:
SELECT DAYNAME(CURDATE());

Obtenemos Saturday, es decir, Sbado. DAYOFWEEK(). Es complementaria de la anterior. En vez de darnos el nombre del da de la semana nos da un cdigo numrico de 1 a 7. El cdigo 1 representa el Domingo, el 2 el Lunes, y as hasta el 7 que representa el Sbado. Ejemplo:
SELECT DAYOFWEEK(CURDATE());

Obtenemos un 7,que indica el Sbado. DATE_FORMAT(). Nos permite presentar las fechas en otros formatos. Los formatos que usaremos son '%d/%m/%y' y '%d/%m/%Y'. Ejemplo:
SELECT DATE_FORMAT(CURDATE(),%d/%m/%Y');

Produce 01/01/2005. DATE_ADD(). Esta funcin nos permite agregar a una fecha cierto nmero de das ( o meses y aos) Ejemplo: Cul es la fecha de dentro de 15 das?
SELECT DATE_ADD(CURDATE(), INTERVAL 15 DAY);

o mejor :
SELECT DATE_FORMAT(DATE_ADD(CURDATE(),INTERVAL 15 DAY) ,%d/%m/%Y');

Produce 16/01/2005. DATE_SUB(). Esta funcin le quita cierto nmero de das (o meses y aos) a una fecha. Ejemplo: Cul es la fecha de hace 15 das?
SELECT DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 15 DAY),%d/%m/%Y');

Produce 17/12/2004. DATEDIFF(). Esta funcin obtiene la diferencia, en das, entre dos fechas. Ejemplo :
SELECT DATEDIFF(2005-4-1,2004-5-30);

Este query produce 306, lo que significa que del 30/5/2004 al 1/4/2005 van 306 das. YEAR(), MONTH() ,DAY() extraen de una fecha el ao, el mes y da correspondientes. Ejemplo:
SELECT MONTH(2005-4-1); produce 4, el nmero del mes.

Problemas resueltos 1. A qu fecha estamos? Solucin:


2. SELECT CURDATE();

La instruccin SELECT se puede usar para hacer diversas operaciones que no tienen relacin con una base de datos. En este caso, nos da la fecha. Esta fecha sale en el formato ao-mes-da que puede resultar difcil de leer para muchas personas. Por eso, es mejor
SELECT DATE_FORMAT(CURDATE(),'%d / %m / %y');

con lo que se obtiene el formato da/mes/ao usual. El uso de blancos antes y despus de los signos / es opcional. En general la funcin DATE_FORMAT( .........., '%d / %m / %y') nos sirve para presentar cualquier fecha en un formato legible. 3. Qu da de la semana es hoy? Solucin: Si nos conformamos con un resultado en ingls alcanza con
4. SELECT DAYNAME(CURDATE());

Para obtener el da de la semana en espaol hay que escribir un poco ms :


SELECT CASE DAYOFWEEK(CURDATE()) WHEN 1 THEN 'Domingo' WHEN 2 THEN 'Lunes' WHEN 3 THEN 'Martes' WHEN 4 THEN CONCAT('Mi',CHAR(130),'rcoles') WHEN 5 THEN 'Jueves' WHEN 6 THEN 'Viernes' WHEN 7 THEN CONCAT('S',CHAR(160),'bado') END AS Dia_de_la_Semana;

Este mismo mtodo puede aplicarse a cualquier fecha sustituyendo el CURDATE() de la primera lnea por la fecha dada. 5. Obtener una lista de los empleados que ingresaron despus del 15/12/1999, con sus nombres y fechas de ingreso en el formato usual da/mes/ao (el ao con 4 cifras). Solucin:
6. 7. 8. 9. SELECT Nombre,DATE_FORMAT(Fecha_ingreso,'%d/%m/%Y') AS Fecha_de_Ingreso FROM Empleados WHERE Fecha_ingreso > '1999-12-15';

La %Y en el formato de la fecha produce el ao con 4 cifras. 10. Qu ventas se han realizado en los ltimos 25 das? Solucin: Incluimos el da de hoy entre los 25 das mencionados.
11. 12. SELECT * FROM Ventas WHERE Fecha > DATE_SUB(CURDATE(), INTERVAL 25 DAY);

13. Qu ventas se han realizado en el corriente mes? Solucin:


14. 15. 16. SELECT * FROM Ventas WHERE Fecha > DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE()) DAY);

Cmo funciona este query? Primero se evala CURDATE() dando la fecha del da. DAYOFMONTH separa de esa fecha el da del mes. Supongamos que se trata de un da 3. Entonces DATE_SUB le resta a su primer parmetro CURDATE(), el nmero de da del mes. Pero 3 das antes del 3 de mes est el ltimo da del mes anterior. Una fecha mayor que el ltimo da del mes anterior es lo mismo que una fecha del mes actual. 17. Qu conformes a pagar se vencen durante los prximos 18 das? Solucin:
18. 19. SELECT * FROM CONFORMES WHERE Vencimiento<=DATE_ADD(CURDATE(),INTERVAL 18 DAY);

20. Realizar una tabla con los datos de los conformes, pero agregando una columnas donde se indica cuntos das faltan para el vencimiento de cada uno. Solucin:
21. SELECT *, DATEDIFF(Vencimiento,CURDATE()) AS Dias_para_Vencimiento 22. FROM Conformes;

23. Obtener una lista de los conformes con sus fechas de vencimiento en la forma , por ejemplo, 3 de Febrero de 2004 , ordenados por fecha de vencimiento de manera que el conforme que se vence primero aparezca primero en la lista. Solucin: En ingls las fechas se formatean con facilidad:
24. 25. 26. 27. 28. SELECT Acreedor, DATE_FORMAT(Vencimiento,'%M %D, %Y') AS Vencimiento, Importe FROM Conformes ORDER BY Vencimiento;

Para obtener un resultando semejante en espaol hay que escribir:


SELECT Acreedor, CONCAT( DAYOFMONTH(Vencimiento), ' de ', CASE MONTH(Vencimiento) WHEN 1 THEN 'Enero' WHEN 2 THEN 'Febero'

WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN

3 THEN 'Marzo' 4 THEN 'Abril' 5 THEN 'Mayo' 6 THEN 'Junio' 7 THEN 'Julio' 8 THEN 'Agosto' 9 THEN 'Setiembre' 10 THEN 'Octubre' 11 THEN 'Noviembre' 12 THEN 'Diciembre'

END, ' de ', YEAR(Vencimiento)) AS Vencimiento, Importe FROM Conformes;

29. Obtener una lista de los empleados con el nmero de aos que llevan en la empresa al da de hoy. Se cuentan nicamente aos enteros. Por ejemplo, si un empleado lleva 5 aos y 10 meses en la empresa, contamos nicamente 5 aos. Solucin:
30. 31. SELECT *, YEAR(CURDATE()) - YEAR(Fecha_ingreso) (RIGHT(CURDATE(),5) 32. < RIGHT(Fecha_ingreso,5)) AS Antiguedad 33. FROM Empleados;

Veamos cmo funciona este query, que es bastante complejo. En primer lugar, aparece un valor booleano RIGHT(CURDATE(),5) < RIGHT(Fecha_ingreso,5). Para entender este valor, en primer lugar debemos darnos cuenta que RIGHT(CURDATE(),5) representa los 5 caracteres ms a la derecha de CURDATE(). Es decir, los dos dgitos del mes de hoy, un guin, y los dos dgitos del da de hoy. El signo de < que separa los dos RIGHT representa en realidad una pregunta : el primero da un resultado alfabticamente anterior al segundo ? Esto es equivalente a preguntar si la fecha de hoy es anterior al da en que se cumplen aos de la fecha de ingreso. Ahora bien, el hecho que una condicin sea verdadera se representa en el computador por un valor 1 mientras que si la condicin es falsa se guarda un valor 0. Entonces, si la desigualdad es verdadera la expresin (RIGHT(CURDATE(),5) < RIGHT(Fecha_ingreso,5)) vale 1. En caso contrario, vale 0. Veamos un ejemplo completo. Si un empleado hubiese ingresado el 20 de diciembre del ao y hoy es 10 de octubre, entonces todava no cumpli un ao. Obtenemos un resultado correcto porque YEAR(CURDATE()) - YEAR(Fecha_ingreso) vale 1 y (RIGHT(CURDATE(),5) < RIGHT(Fecha_ingreso,5)) tambin vale 1. La diferencia, cero, indica que el empleado todava no tiene un ao en la empresa. Cuando llegue el 20 de diciembre, la expresin (RIGHT(CURDATE(),5) < RIGHT(Fecha_ingreso,5)) pasa a valer 0 y la diferencia YEAR(CURDATE()) YEAR(Fecha_ingreso) - (RIGHT(CURDATE(),5) < RIGHT(Fecha_ingreso,5)) pasa a valer 1. Es decir, ahora el empleado ha cumplido un ao en la empresa. Este truco es til porque muchas reglamentaciones sobre licencias y primas dependen de los aos enteros que tenga el empleado.

Funciones de agregados. (Aggregate functions)


A menudo queremos realizar operaciones sobre un conjunto de filas de una tabla. Por ejemplo, queremos sumar los contenidos de una columna Importe en toda la tabla, o slo en las filas que cumplen cierta condicin. Para eso existen ciertas funciones llamadas funciones de agregados (Aggregate functions).

Veremos algunas de estas funciones: SUM(). Esta funcin totaliza una columna, dentro de las filas que cumplen una condicin, o de todas las filas si no es especifica ninguna condicin. En lo que sigue abreviaremos esta expresin y diremos simplemente de las filas especificadas. Ejemplos: Sumar todos los importes de Ventas.
mysql> SELECT SUM(importe) FROM ventas; +--------------+ | SUM(importe) | +--------------+ | 1010.00 | +--------------+

Sumar todos los importes de Ventas, con fecha del ao 2003.


mysql> SELECT SUM(importe) FROM ventas WHERE YEAR(fecha)=2003; +--------------+ | SUM(importe) | +--------------+ | NULL | +--------------+

COUNT(*). Cuenta todas las filas especificadas. Por ejemplo, el siguiente query produce el nmero de filas de la tabla lineas_factura.
mysql> SELECT COUNT(*) FROM lineas_factura; +----------+ | COUNT(*) | +----------+ | 5 | +----------+

COUNT(Nombre_de_columna). Cuenta cuntos valores no NULL hay de la columna especificada dentro de las filas especificadas. Por ejemplo, el siguiente query produce el nmero de direcciones de clientes que tenemos registradas.
mysql> SELECT COUNT(direccion) FROM clientes; +------------------+ | COUNT(direccion) | +------------------+ | 2 | +------------------+

COUNT ( DISTINCT Nombre_de_columna). Cuenta cuntos valores no NULL diferentes hay de la columna especificada, en las filas especificadas. El siguiente ejemplo produce el nmero de clientes distintos a los cuales se les han registrado ventas.
mysql> SELECT COUNT(DISTINCT(cliente)) FROM ventas; +--------------------------+ | COUNT(DISTINCT(cliente)) | +--------------------------+ | 3 | +--------------------------+

MAX(). Produce el mximo valor de una columna dentro de las filas especificadas. MIN(). Produce el mnimo valor de una columna en las filas especificadas. AVG(). Produce el promedio de los valores de una columna numrica, contando slo las filas especificadas.

Introduccin a las subqueries Un subquery es una instruccin SELECT dentro de otra instruccin. Los subqueries que vamos a estudiar en esta seccin son llamado subqueries escalares. Producen una sola cantidad que como de costumbre puede ser numrica, una cadena de caracteres o una fecha. Un subquery siempre debe estar rodeado de parntesis. Usaremos subqueries para crear condiciones en clusulas WHERE.

Problemas resueltos 1. Obtener la suma de los salarios pagos en la Empresa. Solucin: Debemos obtener la suma de la columna Salario en la tabla Empleados.
2. SELECT SUM(Salario) FROM Empleados;

3. Obtener la suma de los salarios mayores a 11000. Solucin: Debemos obtener la suma de la columna Salario de aquellas filas de Empleados que tienen Salario mayor a 11000.
4. 5. SELECT SUM(Salario) FROM Empleados WHERE Salario > 11000;

6. Contar cuntos empleados tiene la empresa. Solucin: Debemos obtener el nmero de filas en la tabla Empleados.
7. SELECT COUNT(*) FROM Empleados;

8. Contar cunto empleados tienen salario menor de 11000. Solucin: Debemos obtener el nmero de filas en la tabla Empleados con Salario <11000.
9. 10. SELECT COUNT(*) FROM Empleados WHERE Salario < 11000;

11. Contar cuntas direcciones de clientes se tienen. Solucin: Debemos obtener el nmero de filas de Clientes cuya columna Direccion no es NULL.
12. SELECT COUNT(Direccion) FROM Clientes;

Observar que como se especific COUNT(Direccion) las direcciones NULL no se cuentan. En cambio SELECT COUNT(*) FROM Clientes cuenta todas las filas, independientemente que tengan o no direccin (o algna otra columna) NULL. 13. Cul es el salario promedio de la empresa? Solucin:
14. SELECT AVG(Salario) FROM Empleados;

15. Cul es el salario mximo pago por la empresa? Solucin:


16. SELECT MAX(Salario) FROM Empleados;

17. Y el salario mnimo? Solucin:


18. SELECT MIN(Salario) FROM Empleados;

19. Cul son los empleados ms antiguos de la empresa? Solucin: Vamos a seleccionar todas las filas de la tabla Empleados con Fecha de Ingreso igual a la fecha de ingreso mnima.
20. 21. 22. SELECT * FROM Empleados WHERE Fecha_ingreso = (SELECT MIN(Fecha_ingreso) FROM Empleados);

23. Hallar los nombres de los empleados con salario mximo en la empresa. Solucin:
24. 25. SELECT Nombre FROM Empleados WHERE Salario =

26.

(SELECT MAX(Salario) FROM Empleados);

27. Cuntos salarios distintos se pagan en la empresa? Solucin:


28. SELECT COUNT(DISTINCT Salario) FROM Empleados;

You might also like