27 - Funciones para el uso de fecha y hora.


Problema:
Una empresa registra los datos de sus empleados en una tabla llamada "empleados".

1- Elimine la tabla "empleados" si existe.

2- Cree la tabla:
 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  sexo char(1),
  domicilio varchar(30),
  fechaIngreso date,
  fechaNacimiento date,
  sueldoBasico decimal(5,2) unsigned,
  primary key(documento)
 );

3- Ingrese algunos registros:
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390);
 insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
  values ('306154269','Federico Gonzalez','m','Peru 390','1996-08-15','1985-05-01',580);

4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos los empleados que 
cumplen ese mes. Necesitamos los nombres y fecha de nacimiento de los empleados que cumplen años en 
el mes de mayo:
 select nombre,fechaNacimiento from empleados
   where month(fechaNacimiento)=5;

5- También es política de la empresa, aumentar el 1% del sueldo básico a los empleados, cada vez 
que cumplen un año más de servicio. Necesitamos los nombres, fecha de ingreso a la empresa y sueldo 
básico de todos los empleados que cumplen un año más de servicio en el mes de agosto, y una columna 
calculando el incremento del sueldo:
 select nombre,fechaIngreso,sueldoBasico,
  (sueldoBasico+sueldoBasico*0.01) as 'Sueldo Incrementado'
  from empleados
  where month(fechaIngreso)=8;

6- Actualizamos el sueldo aumentando el 1% a los empleados que cumplen un año de servicio en el mes 
de agosto:
 select nombre,fechaIngreso,sueldoBasico,
  (sueldoBasico+sueldoBasico*0.01) as 'Sueldo Incrementado'
  from empleados
  where month(fechaIngreso)=8;

7- Verifique si la actualización se realizó:
 select nombre, sueldobasico
  from empleados
  where month(fechaIngreso)=8; 

8- Si el empleado cumple 10,20,30,40... años de servicio, se le regala una placa recordatoria. La 
secretaria de Gerencia necesita saber la cantidad de años de servicio que cumplen los empleados que 
ingresaron en el mes de agosto para encargar dichas placas:
 select nombre,fechaIngreso,
  year(current_date)-year(fechaIngreso) as 'Años de servicio'
  from empleados
  where month(fechaIngreso)=8;

En la sentencia anterior, extraemos el año de las fechas actual y de ingreso con la función "year
()" y las restamos, para calcular los años de servicio. 



 

Otros problemas:
A) Un instituto de enseñanza almacena los datos de sus estudiantes en una tabla llamada "alumnos".

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla con la siguiente estructura:
 create table alumnos(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  fechaNacimiento date,
  primary key (documento)
 );

3- Ingrese los siguientes registros:
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('22345345','Mariana Perez','Colon 234','1986-10-08');
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('23545345','Marcos Morales','Avellaneda 348','1985-12-18');
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('24356345','Analia Gonzalez','Caseros 444','1976-06-28');
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('20254125','Ramiro Torres','Dinamarca 209','1978-01-28');
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('20445778','Carmen Miranda','Uspallata 999','1980-05-30');
 insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
  values('28111444','Natalia Figueroa','Sarmiento 856','1986-04-29');

4- El institulo quiere conocer las edades de los alumnos:
 select nombre, fechaNacimiento, current_date as 'Fecha actual',
 (year(current_date)-year(fechaNacimiento)) -
 (right(current_date,5)<right(fechaNacimiento,5)) as 'Edad'
 from alumnos;

En la sentencia anterior con "year()" extraemos la parte correspondiente al año de ambas fechas 
(actual y de nacimiento) y con "right()" extraemos los 5 primeros caracteres que representan la 
parte del mes y día de ambas fechas; la comparación retorna 1 ó 0, lo que corresponde a la 
diferencia de 1 año a restar de la edad si el dia de la fecha actual es anterior que la fecha de 
nacimiento. Finalmente, se coloca un alias para usar como título de la columna para hacerlo más 
comprensible.


B) La empresa que provee de luz a los usuarios de un municipio la luz. Almacena en una tabla 
algunos datos de los usuarios:
- documento, cadena siempre de 8 caracteres, no nulo,
- monto a pagar, valor con decimales positivo,
- fecha de vencimiento.
Si la boleta no se paga hasta el día del vencimiento, inclusive, se incrementa al monto, un 1% del 
monto cada día de atraso.

1- Elimine la tabla, si existe.

2- Cree la tabla.

3- Ingrese algunos registros con fechas de vencimiento anterior a la fecha actual (vencidas) y 
posteriores a la fecha actual (no vencidas).

4- Muestre el documento del usuario, la fecha de vencimiento, la fecha actual (en que efectúa el 
pago), el monto, la cantidad de días de atraso (respecto de la fecha de vencimiento), el recargo y 
el total a pagar con el recargo:
 select documento,fechavencimiento,
  current_date as 'Fecha Pago',
  monto, 
  datediff(current_date,fechavencimiento) as 'Retraso en dias',
  (monto*0.01*datediff(current_date,fechavencimiento)) as 'Recargo',
  monto+((monto*0.01)*datediff(current_date,fechavencimiento)) as 'Total a Pagar'
  from luz
  where datediff(current_date,fechavencimiento)>0;

"datediff()" retorna la cantidad de días entre una fecha y otra; si la fecha enviada como primer 
argumento es anterior a la del segundo argumento, retorna un valor negativo. Por eso, en la 
sentencia anterior colocamos la condición "where", si la obviamos, descontará el 1% del monto por 
cada día de diferencia entre la fecha de vencimiento y la fecha actual.

C-) En una página web se solicitan los siguientes datos para guardar información de sus visitas:
 nombre, mail, pais.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  fecha datetime,
  primary key(numero)
);

3- Ingrese algunos registros:
 insert into visitas (nombre,mail,fecha)
  values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10 10:10');
 insert into visitas (nombre,mail,fecha)
  values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10 21:30');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11 15:45');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12 08:15');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12 20:45');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12 16:20');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15 16:25');

4- Se necesita el nombre de los usuarios y la hora de visita:
 select nombre,time(fecha) from visitas;

5- Se necesita conocer el nombre de los usuarios y el nombre del mes de cada visita:
 select nombre,monthname(fecha)
  from visitas;

6- Se necesita saber la cantidad de visitas por día (lunes, martes...), mostrando el nombre del día:
 select dayname(fecha),count(*)
 from visitas
 group by dayname(fecha);

Retornar