domingo, 8 de abril de 2012

19 - Tipos de datos (fechas y horas)

Para guardar fechas y horas dispone de varios tipos:

1) date: representa una fecha con formato "YYYY-MM-DD". El rango va de 
"1000-01-01" a "9999-12-31".

2) datetime: almacena fecha y hora, su formato es "YYYY-MM-DD HH:MM:SS". 
El rango es de "1000-01-01 00:00:00" a "9999-12-31 23:59:59".

3) time: una hora. Su formato es "HH:MM:SS". El rango va de "-838:59:59" a "838:59:59".

4) year(2) y year(4): un año. Su formato es "YYYY" o "YY". Permite valores desde 1901 a 2155
 (en formato de 4 dígitos) y desde 1970 a 2069 (en formato de 2 dígitos).

Si ingresamos los valores como cadenas, un valor entre "00" y "69" es convertido a valores "year" en el rango de 2000 a 2069; si el valor está entre "70" y "99", se convierten a valores "year" en el rango 1970 a 1999.
Si ingresamos un valor numérico 0, se convierte en "0000"; entre 1 y 69, se convierte a valores "year" entre 2001 a 2069; entre 70 y 99, es convertido a valores "year" de 1970 a 1999.

Para almacenar valores de tipo fecha se permiten como separadores "/", "-" y ".".

Si ingresamos '06-12-31' (año de 2 dígitos), lo toma como '2006-12-31'.

Si ingresamos '2006-2-1' (mes y día de 1 dígito), lo toma como '2006-02-01'.

Si ingresamos '20061231' (cadena sin separador), lo toma como '2006-12-31'.

Si ingresamos 20061231 (numérico), lo toma como '2006-12-31'.

Si ingresamos '20061231153021' (cadena sin separadores), lo toma como '2006-12-31 15:30:21'.

Si ingresamos '200612311530' (cadena sin separadores con un dato faltante) no lo reconoce como fechahora y almacena ceros.

Si ingresamos '2006123' (cadena sin separadores con un dato faltante) no lo reconoce como fecha y almacena ceros.

Si ingresamos '2006-12-31 11:30:21' (valor date time) en un campo 'date', toma sólo la parte de la 
fecha, la hora se corta, se guarda '2006-12-31'.

Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por ejemplo, si sólo 
necesitamos registrar un año (sin día ni mes), el tipo adecuado es "year" y no "date".

Tipo  Bytes de almacenamiento
_______________________________________
date  3
datetime 8
time  3
year  1
 
 
 
 
Problema Resuelto: 

Una playa de estacionamiento guarda cada día los datos de los vehículos que ingresan a la playa en una tabla llamada "vehiculos".

Eliminamos la tabla "vehiculos" si existe:

drop table if exists vehiculos;
 
Creamos la tabla con la siguiente estructura:

create table vehiculos(
  patente char(6) not null,
  tipo char (4),
  horallegada time not null,
  horasalida time
 );
 
Hemos definido el campo "patente" de tipo "char" y no "varchar" porque la cadena de caracteres siempre tendrá la misma longitud (6 caracteres), con esta definición ocupamos 6 bytes, si lo hubiésemos definido como "varchar(6)" ocuparía 7 bytes. Lo mismo sucede con el campo "tipo", en el cual almacenaremos "auto" o "moto", necesitamos 4 caracteres fijos. Para los campos que registran la hora de llegada y de salida de cada vehículo usamos "time" porque solamente almacenaremos horas, no fechas.

Ingresamos algunos registros:

insert into vehiculos (patente,tipo,horallegada) 
values ('ACD123','auto','8:30');
 insert into vehiculos (patente,tipo,horallegada) 
values('BGF234','moto','8:35');
 insert into vehiculos (patente,tipo,horallegada) 
values('KIU467','auto','9:40');
 
Vemos los registros cargados:

select * from vehiculos;
 
Note que no ingresamos los segundos y colocó por defecto "00" para ellos.

Actualizamos la hora de salida del vehículo con patente "ACD123":

update vehiculos set horasalida='11:45'
 where patente='ACD123';
 
Ingresemos un registro con la hora, sin los minutos:


insert into vehiculos values('LIO987','auto','10',null);
veamos lo que sucedió:

select * from vehiculos;
 
almacenó el valor ingresado como si fueran segundos.

Ingresamos un valor de horas y minutos sin separador:

insert into vehiculos values('GTR987','auto','1010',null);
 
incluye el separador, almacena "10:10".

Si ingresamos un valor "datetime" (fecha y hora), almacena solamente la hora:

insert into vehiculos values('HTR234','auto','2006-12-15 12:15',null);
 
Si ingresamos un separador diferente al permitido, por ejemplo "/", guarda solamente el último valor y lo coloca como segundos:

insert into vehiculos values('KUY246','auto','12/15',null);
 
almacena "00:00:15".


Problema Propuesto:

Una concesionaria de autos vende autos usados. Guarda los siguientes 
datos en la tabla "autos":
 
 - marca (fiat 128, renault 11, peugeot 505, etc.)
 - modelo (año)
 - dueño (nombre del dueño)
 - precio (valor con decimales positivo que puede llegar hasta 
999999.99 aprox.).

1- Elimine la tabla si existe.

2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar estos datos: 
 
create table autos(
  marca varchar(15),
  modelo year,
  dueño varchar(30),
  precio decimal (8,2) unsigned  
 );

3- Ingrese los siguientes registros:
 Fiat 128,1970,Juan Lopez,50000
 Renault 11,1990,Juan Lopez,80000
 Fiat 128,1971,Ana Ferreyra,51000
 Peugeot 505,1998,Luis Luque,99000
 Peugeot 505,1997,Carola Perez,85000

4- Seleccione todos los autos cuyo modelo sea menor a "1995":
 
5- Muestre la marca y modelo de los autos que no sean de "1970":
 
6- Ingrese un auto con el valor para "modelo" de tipo numérico:
 Peugeot 505,1995,Carlos Lopez,88000
 
 
Otros problemas: 
Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla, si existe:
 
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: 
 
create table empleados(
  nombre varchar(20),
  documento char(8),
  sexo char(1),
  domicilio varchar(30),
  fechaingreso date
 );

3- Ingrese algunos registros:
 
  Juan Perez,22333444,m,Colon 123,1990-10-08
  Ana Acosta,23333444,f,Caseros 987,1995-12-18
  Lucas Duarte,25333444,m,Sucre 235,2005-05-15
  Pamela Gonzalez,26333444,f,Sarmiento 873,1999-02-12
  Marcos Juarez,30333444,m,Rivadavia 801,2002-09-22

4- Seleccione todos los datos de los empleados que ingresaron a la 
empresa antes del 2000:
 
5- Muestre el nombre y la fecha de ingreso de los empleados de sexo masculino:
 
6- Modifique la fecha de ingreso del empleado con documento "22333444" a 
"1990-10-18":
 
7- Ingrese un empleado con valor para "fechaingreso" en la cual coloque 2 
digitos correspondientes al año:
 
  Susana Duarte,30123456,f,Sucre 1234,99-02-12

8- Ingrese un empleado colocando sólo un dígito en la parte de la fecha 
correspondiente al mes y día:
 
  Daniel Herrero,30000001,m,null,1980-2-03

9- Ingrese una fecha de ingreso sin separadores:
 
  Ana Juarez,31123123,f,null,19900306

10- Ingrese un valor de tipo fecha y hora:
 
  Juan Mores,32222333,m,null,1990-03-06 10:15
 
 Sólo guarda la parte de la fecha.

11- Ingrese un valor que MySQL no reconozca como fecha:
 
  Hector Perez,34444555,m,null,1990036
 
 Almacenará ceros.
 

No hay comentarios:

Publicar un comentario