domingo, 8 de abril de 2012

27 - Funciones para el uso de fecha y hora.

MySQL tiene algunas funciones para trabajar con fechas y horas. Estas son algunas:


-adddate(fecha, interval expresion): retorna la fecha agregándole el intervalo especificado. Ejemplos:

adddate('2006-10-10',interval 25 day) retorna "2006-11-04".

adddate('2006-10-10',interval 5 month) retorna "2007-03-10".

-adddate(fecha, dias): retorna la fecha agregándole a fecha "dias". Ejemplo:

adddate('2006-10-10',25), retorna "2006-11-04".

-addtime(expresion1,expresion2): agrega expresion2 a expresion1 y retorna el resultado.

-current_date: retorna la fecha de hoy con formato "YYYY-MM-DD" o "YYYYMMDD".

-current_time: retorna la hora actual con formato "HH:MM:SS" o "HHMMSS".

-date_add(fecha,interval expresion tipo) y date_sub(fecha,interval expresion tipo): el argumento "fecha" es un valor "date" o "datetime", "expresion" especifica el valor de intervalo a ser añadido o substraído de la fecha indicada (puede empezar con "-", para intervalos negativos), "tipo" indica la medida de adición o substracción. Ejemplo: 

date_add('2006-08-10', interval 1 month) retorna "2006-09-10";

date_add('2006-08-10', interval -1 day) retorna "2006-09-09";

date_sub('2006-08-10 18:55:44', interval 2 minute) retorna "2006-08-10 18:53:44";

date_sub('2006-08-10 18:55:44', interval '2:3' minute_second) retorna "2006-08-10 18:52:41".

Los valores para "tipo" pueden ser: second, minute, hour, day, month, year, minute_second (minutos y segundos), hour_minute (horas y minutos), day_hour (días y horas), year_month (año y mes), hour_second (hora, minuto y segundo), day_minute (dias, horas y minutos), day_second(dias a segundos).

-datediff(fecha1,fecha2): retorna la cantidad de días entre fecha1 y fecha2.

-dayname(fecha): retorna el nombre del día de la semana de la fecha. Ejemplo:

dayname('2006-08-10') retorna "thursday".

-dayofmonth(fecha): retorna el día del mes para la fecha dada, dentro del rango 1 a 31. Ejemplo:

dayofmonth('2006-08-10') retorna 10.


-dayofweek(fecha): retorna el índice del día de semana para la fecha pasada como argumento. Los valores de los índices son: 1=domingo, 2=lunes,... 7=sábado). Ejemplo:

dayofweek('2006-08-10') retorna 5, o sea jueves.

-dayofyear(fecha): retorna el día del año para la fecha dada, dentro del rango 1 a 366. Ejemplo:

dayofmonth('2006-08-10') retorna 222.

-extract(tipo from fecha): extrae partes de una fecha.

Ejemplos:

extract(year from '2006-10-10'), retorna "2006".
 extract(year_month from '2006-10-10 10:15:25') retorna "200610".
 extract(day_minute from '2006-10-10 10:15:25') retorna "101015";
 
Los valores para tipo pueden ser: second, minute, hour, day, month, year, minute_second, hour_minute, day_hour, year_month, hour_second (horas, minutos y segundos), day_minute (días, horas y minutos), day_second (días a segundos).

-hour(hora): retorna la hora para el dato dado, en el rango de 0 a 23.

Ejemplo: hour('18:25:09') retorna "18";

-minute(hora): retorna los minutos de la hora dada, en el rango de 0 a 59.

-monthname(fecha): retorna el nombre del mes de la fecha dada.

Ejemplo: monthname('2006-08-10') retorna "August".

-month(fecha): retorna el mes de la fecha dada, en el rango de 1 a 12.

-now() y sysdate(): retornan la fecha y hora actuales.

-period_add(p,n): agrega "n" meses al periodo "p", en el formato "YYMM" o "YYYYMM"; retorna un valor en el formato "YYYYMM". El argumento "p" no es una fecha, sino un año y un mes. Ejemplo: 

period_add('200608',2) retorna "200610".

-period_diff(p1,p2): retorna el número de meses entre los períodos "p1" y "p2", en el formato "YYMM" o "YYYYMM". Los argumentos de período no son fechas sino un año y un mes. Ejemplo: 

period_diff('200608','200602') retorna 6.

-second(hora): retorna los segundos para la hora dada, en el rango de 0 a 59.

-sec_to_time(segundos): retorna el argumento "segundos" convertido a horas, minutos y segundos. Ejemplo:

sec_to_time(90) retorna "1:30".

-timediff(hora1,hora2): retorna la cantidad de horas, minutos y segundos entre hora1 y hora2.

-time_to_sec(hora): retorna el argumento "hora" convertido en segundos.

-to_days(fecha): retorna el número de día (el número de día desde el año 0).

-weekday(fecha): retorna el índice del día de la semana para la fecha pasada como argumento. Los índices son: 0=lunes, 1=martes,... 6=domingo). Ejemplo: 

weekday('2006-08-10') retorna 3, o sea jueves.

-year(fecha): retorna el año de la fecha dada, en el rango de 1000 a 9999. Ejemplo:

year('06-08-10') retorna "2006".


Problema Resuelto: 

Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla llamada "prestamos".
En ella almacena la siguiente información:


-título del libro,
 -documento de identidad del socio a quien se le presta el libro,
 -fecha de préstamo,
 -fecha de devolución del libro,
 -devuelto: si el libro ha sido o no devuelto.
 
Eliminamos la tabla "prestamos" si existe:

drop table if exists prestamos;
 
Creamos la tabla:

create table prestamos(
  titulo varchar(40) not null,
  documento char(8) not null,
  fechaprestamo date not null,
  fechadevolucion date,
  devuelto char(1) default 'n'
 );
 
Los libros se prestan por 5 días.

Ingresamos un registro con los 3 primeros datos y calculamos con una función la fecha de devolución:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values ('Manual de 1 grado','23456789','2006-08-10',date_add
('2006-08-10', interval 5 day));
 
Con un "select" vemos cómo quedó almacenado el registro ingresado anteriormente:

select * from prestamos;
 
Ingresemos otros registros de la misma manera:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion)
  values ('Alicia en el pais de las maravillas','23456789',
'2006-08-12',date_add('2006-08-12', interval 5 day));
 insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values ('El aleph','22543987','2006-08-15',date_add('2006-08-15', interval 5 day));
 insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion)
  values ('Manual de geografia 5 grado','25555666','2006-08-30',
date_add('2006-08-30', interval 5 day));
 
Ahora utilizaremos la función "current_date" para la fecha de préstamo:

insert into prestamos (titulo,documento,fechaPrestamo,fechaDevolucion) 
values   ('Atlas universal','24000111',current_date,date_add
(current_date, interval 5 day));



Problema Propuesto:
 
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:
 
 documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico)
 '22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550
 '25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650
 '20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510
 '30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',700
 '20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',700
 '30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
 '20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350
 '24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390
 '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:
 
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:
 
6- Actualizamos el sueldo aumentando el 1% a los empleados que cumplen un 
año de servicio en el mes de agosto:
 
7- Verifique si la actualización se realizó:
 
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:
 
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:
 
 (documento,nombre,domicilio,fechaNacimiento)
  22345345,Mariana Perez,Colon 234,1986-10-08
  23545345,Marcos Morales,Avellaneda 348,1985-12-18
  24356345,Analia Gonzalez,Caseros 444,1976-06-28
  20254125,Ramiro Torres,Dinamarca 209,1978-01-28
  20445778,Carmen Miranda,Uspallata 999,1980-05-30
  28111444,Natalia Figueroa,Sarmiento 856,1986-04-29

4- El institulo quiere conocer las edades de los alumnos:
 
 
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:
 
 


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:
 (nombre,mail,fecha)
 Ana Maria Lopez,AnaMaria@hotmail.com,2006-10-10 10:10
 Gustavo Gonzalez,GustavoGGonzalez@hotmail.com,2006-10-10 21:30
 Juancito,JuanJosePerez@hotmail.com,2006-10-11 15:45
 Fabiola Martinez,MartinezFabiola@hotmail.com,2006-10-12 08:15
 Fabiola Martinez,MartinezFabiola@hotmail.com,2006-09-12 20:45
 Juancito,JuanJosePerez@hotmail.com,2006-09-12 16:20
 Juancito,JuanJosePerez@hotmail.com,2006-09-15 16:25

4- Se necesita el nombre de los usuarios y la hora de visita:
 
5- Se necesita conocer el nombre de los usuarios y el nombre del 
mes de cada visita:
 
6- Se necesita saber la cantidad de visitas por día (lunes, martes...), 
mostrando el nombre del día: 
 
 

1 comentario:

  1. buen dia necesito que me ayudes con un problema.

    nesesito obtener las horas que existen entre dos fechas ejemplo:

    fecha 1 = 2013-01-02 08:20:00
    fecha 2 = 2013-01-06 14:26:00

    necesito saber el total de horas de estas dos fechas

    ResponderEliminar