You are on page 1of 5

MEDIA TÉCNICA DESARROLLO DE SOFTWARE

GUIA DE APRENDIZAJE # 4
TEMA: MySql

RUTA PRÁCTICA:__________________________________
Estudiante :____________________________ Grado:11__ Fecha __/__/_____ Nota ___
JUSTIFICACIÓN: Se pretende que el estudiante conozca algunos aspectos relacionados con el manejo de
Algunos tipos de datos DATE de MySql
OBJETIVOS : Identificar la funcionalidad de algunas funciones sobre algunos tipos de datos

CONTENIDO
Fechas en MySQL
Trabajar con fechas desde SQL MySQL es realmente potente con el cálculo y el tratamiento de las fechas. Para
sacar el máximo rendimiento disponemos de las siguientes instrucciones.
CURRENT_DATE()
Esta función da la fecha del día Ejemplo:
SELECT CURRENT_DATE();
Obtenemos 2005-01-01, en el formato de fecha ‘Año-Mes-Día’ propio de MySQL.
Esta fecha sale en el formato año-mes-día que puede resultar un poco difícil de leer.
Ejemplo1 para averiguar las mascotas mayores 1 año
SELECT nombre , YEAR(CURDATE()) -YEAR(nacimiento) AS EDAD from MASCOTAS
WHERE (year( CURDATE()) -year(nacimiento)) >= 1
DATE_FORMAT podemos dar formato a la salida del texto.
SELECT DATE_FORMAT(CURDATE(),'%d/%m/%y');
con lo que se obtiene el formato día/mes/año usual.

DAYNAME()
Dada una fecha, esta función da el nombre en inglés del día de la semana correspondiente.
Ejemplo: SELECT DAYNAME(CURDATE());
Obtenemos por ejemplo, Sunday.
DAYOFWEEK()
Es complementaria de la anterior. En vez de darnos el nombre del día de la semana nos da un código
numérico de 1 a 7. El código 1 representa el Domingo, el 2 el Lunes, y así hasta el 7 que representa el Sábado.
Ejemplo: SELECT DAYOFWEEK(CURDATE());
Obtenemos por ejemplo un 2,que indica el lunes.
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 23/04/2005.
DATE_ADD()
Esta función nos permite agregar a una fecha cierto número de días ( o meses y años)
Ejemplo: ¿Cuál es la fecha de dentro de 15 días?
SELECT DATE_ADD(CURDATE(), INTERVAL 15 DAY);
también podriamos hacer
SELECT DATE_FORMAT(DATE_ADD(CURRENTDATE(),INTERVAL 15 DAY) ,’%d/%m/%Y');

DATE_SUB()
Esta función le quita cierto número de días (o meses y años) a una fecha.
Ejemplo: ¿Cuál es la fecha de hace 15 días?
SELECT DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 15 DAY),’%d/%m/%Y');
DATEDIFF()
Esta función obtiene la diferencia, en días, entre dos fechas.
Ejemplo : SELECT DATEDIFF(‘2005-4-23’,’2004-5-15’); funciona con Mysql 4.1 en adelante

Preparado por: Juan Carlos Pérez P. versión 1.0 1


www.esnips.com/web/desarrollo
YEAR(), MONTH() ,DAY()
SELECT nombre , DAYOFYEAR(CURRENT_DATE) -DAYOFYEAR(nacimiento) AS EDAD from
MASCOTAS
WHERE (year( CURDATE()) -year(nacimiento)) >= 1
extraen de una fecha el año, el mes y día correspondientes.
Ejemplo: SELECT MONTH(‘2005-4-23’);
sacando como resultado 4, el número del mes.
El format de un valor DATE es 'YYYY-MM-DD'. De acuerdo al estándard SQL ningún otro formato se
permite. Debería usar este formato en las sentencias UPDATE y en la cláusula WHERE de las sentencias
SELECT. Por ejemplo:
SELECT * FROM nombre_de_tabla WHERE date >= '2003-05-05';
Por motivos de conveniencia, MySQL convierte automáticamente una fecha a un número si la fecha se utiliza
en un contexto numérico (y viceversa). Es también suficientemente inteligente para permitir diversos
formatos de cadena de carácteres cuando se está actualizando y en las cláusulas WHERE que comparan una
fecha con una columna TIMESTAMP, DATE, o DATETIME. (Diversos formatos, significa que puede
utilizarse cualquier carácter de puntuación como separador de las partes de la fecha. Por ejemplo, '2004-08-15'
y '2004#08#15' son equivalentes.) MySQL también puede convertir una cadena de carácteres que no contenga
separadores (como '20040815'), siempre que tenga sentido como fecha.

Cuando compara una colmna DATE, TIME, DATETIME, o TIMESTAMP a una cadena de carácteres
constante con los operadores <, <=, =, >=, >, o BETWEEN, MySQL normalmente convierte la cadena de
caráteres a un entero largo interno para una comparación más rápda (y también para hacer una comparación
algo más permisiva). Aún así, esta conversión está sujeta a las siguientes restricciones:

• Cuando compara dos columnas


• Cuando usted compare columnas DATE, TIME, DATETIME, o TIMESTAMP con una expresión.
• Cuando usted utilice cualquier otro método de comparación que no sean aquellos recientemente
citados, como IN o STRCMP().

Para estos casos excepcionales, la comparación se hace convirtiendo los objetos a cadenas de carácteres y
realizando una comparación de cadenas de carácteres.

Para mantener todo a salvo, asuma que las fechas son comparadas como cadenas de carácteresy utilice las
funciones de cadena de carácteres apropiadas para comparar un valor temporal con una cadena de carácteres.
La fecha especial '0000-00-00' puede almacenarse y recogerse como '0000-00-00'. Cuando se utiliza una fecha
'0000-00-00' a través de MyODBC, es convierte automáticamente en NULL en MyODBC 2.50.12 y superiores,
porque ODBC no puede gestionar este tipo de fechas.
Como MySQL realiza las conversiones anteriores, las siguientes sentencias funcionan:
INSERT INTO nombre_de_tabla (idate) VALUES (19970505);
INSERT INTO nombre_de_tabla (idate) VALUES ('19970505');
INSERT INTO nombre_de_tabla (idate) VALUES ('97-05-05');
INSERT INTO nombre_de_tabla (idate) VALUES ('1997.05.05');
INSERT INTO nombre_de_tabla (idate) VALUES ('1997 05 05');
INSERT INTO nombre_de_tabla (idate) VALUES ('0000-00-00');
SELECT idate FROM nombre_de_tabla WHERE idate >= '1997-05-05';
Pero lo siguente no funciona:
SELECT idate FROM nombre_de_tabla WHERE STRCMP(idate,'20030505')=0;

STRCMP() es una función de comparación de cadenas, así que convierte idate a una cadena de caracteres en
formato 'YYYY-MM-DD' y realiza una comparación de cadenas. Es decir, NO convierte '20030505' en la fecha
'2003-05-05' para realizar una comparación de fechas.

Preparado por: Juan Carlos Pérez P. versión 1.0 2


www.esnips.com/web/desarrollo
Si está utilizando el modo SQL ALLOW_INVALID_DATES (permitir fechas no válidas), MySQL le permite
almacenar las fechas que le proporciona con una comprobación mínima: MySQL se asegura únicamente que
el día esté en el rango entre 1 y 31, y el mes en el rango entre 1 y 12.

Esto hace que MySQL sea muy convenienta para las aplicaciones web en que usted obtiene el año, mes y día
en tres campos diferentes y quiere almacenar exactamente lo que el usuario insertó (sin validación de fechas).

Si no está utilizando el modo SQL NO_ZERO_IN_DATE, la parte del día o el mes pueden ser cero. Esto es
conveniente si quiere almacenar una fecha de nacimiento en una columna DATE y solo conoce parte de esa
fecha.

Si no está utlizando el modo SQL NO_ZERO_DATE, MySQL también le permite almacenar '0000-00-00'
como fecha comodín. En algunos momentos esto puede ser más adecuado que utilizar valores NULL.

Si la fecha no puede ser convertida a ningún valor razonable, se almacena un 0 en la columna DATE, que se
extrae como '0000-00-00'. Esto es una cuestión de velocidad y conveniencia. Creemos que la responsabilidad
del servidor de bases de datos es recoger la misma fecha que usted almacenó (aún cuando la fecha no fuese
lógicamente correcta en todos los casos). Creemos que es responsabilidad de la aplicación y no del servidor
comprobar las fechas.

Actividades:

Teniendo en cuenta el taller # 2 y dando solución tenemos el siguiente Modelo entidad Relación

Cliente

Factura Detalle factura Articulos

Eventos

Ahora construimos el script para crear e insertar los datos

DROP table IF EXISTS eventos;


CREATE table eventos(
id int(2) primary key, Nombre char(20));
insert into eventos ( id, nombre)
values(1,'Matrimonio'),
(2,'15 Años'),
(3,'Aniversario'),
(4,'Bautizos'),
(5,'Primera comunión'),
(6,'Graduación'),
(7,'Otros');
DROP TABLE IF EXISTS factura;
CREATE TABLE factura (
Id_factura CHAR (5),
Id_cliente INT (8),
Id_evento int (2),
Fecha_inicio DATE,
Fecha_Fin DATE);
INSERT INTO factura(Id_factura,Id_cliente,Id_evento,
Preparado por: Juan Carlos Pérez P. versión 1.0 3
www.esnips.com/web/desarrollo
Fecha_inicio,Fecha_Fin)
VALUES
('00001',1, 1,'2007-03-01', '2007-03-05'),
('00002',2,1,'2007-02-01','2007-02-05'),
('00003',4,2,'2007-02-01','2007-02-05'),
('00004',7,4,'2007-04-15','2007-04-25'),
('00005',3,7,'2007-05-01','2007-05-05'),
('00006',5,5,'2007-05-12','2007-05-14'),
('00007',8,5,'2007-09-21','2007-09-22'),
('00008',6,6,'2007-05-10','2007-05-15');

DROP TABLE IF EXISTS detalle_factura;


CREATE TABLE Detalle_factura (
id_factura char(5),
Id_Articulo char(3),
Cantidad int(8),
Valor int(8));
INSERT INTO detalle_factura(Id_factura,Id_Articulo,cantidad,valor)
VALUES
('00001','001',4,1200),
('00001','004',4,50000),
('00003','002',5,2300),
('00003','004',10,50000),
('00003','007',20,1200),
('00004','005',10,1200),
('00004','005',9,1200),
('00004','006',1,5600),
('00005','003',6,2300),
('00006','008',4,3000),
('00006','001',4,1200),
('00007','001',4,1200),
('00007','002',8,2300),
('00008','004',10,50000),
('00008','007',13,1200),
('00008','005',10,1200),
('00008','005',9,1200),
('00008','006',6,5600),
('00008','003',8,2300),
('00008','008',2,3000);

DROP TABLE IF EXISTS Articulo;


CREATE TABLE Articulo (
Id_Articulo char(3),
Nombre Char (20),
Valor INT (8),
Valor_hora INT(8),
Cantidad int(8));
INSERT INTO articulo
(id_articulo,Nombre,Valor,Valor_hora,cantidad)
values
('001','Silla plástica',30000,1200,2000),
('002','Mesa x 4',60000,2300,1000),
('003','Reflectores',200000,2300,15),
('004','Alfombras 2x 10 mts',230000,50000,3),
('005','Panel',15000,1200,175),
('006','Separadores',26000,5600,1500),
('007','Lámpara Ref 230',25000,1200,20),
Preparado por: Juan Carlos Pérez P. versión 1.0 4
www.esnips.com/web/desarrollo
('008','Extensión Energía',35000,3000,17);

DROP TABLE IF EXISTS Cliente;


CREATE TABLE Cliente (
id int(8) PRIMARY key,
Nombre char(30),
tel int(13),
dir char(25));
INSERT INTO cliente(id, nombre,tel,dir)
values
(1,'Carlos Montoya',2789222,'Transv 50 # 23-10'),
(2,'Diego Arcila',3305079,'Cra 50 a 56-50'),
(3,'J & J Compañía',25600011,'Cra 70 # 23-12'),
(4,'Cia & Hermanos',5600001,'Circ 10 # 10-15'),
(5,'Juan Marína',2563214,'Cra 89 # 10 -36'),
(6,'Carlos Acevedo',2782100,'Transv 50 # 23-10'),
(7,'Diego Acevedo Marín',3305079,'Cra 49 b 61-57'),
(8,'Almacenes jj',25600011,'Cra 60 # 13-12'),
(9,'Cia & Hermanos',5600001,'Circ 10 # 10-15'),
(10,'Juan Marína',2563214,'Cra 89 # 10 -36');

Ejercicio 1: Si queremos hallar numero de factura, el articulo, valor unitario , número de dias para la factura
# 00001

SELECT f.id_factura, a.nombre, df.valor As Valor_Unitario, df.cantidad,


DAYOFYEAR(f.FECHA_FIN)- DAYOFYEAR(f.fecha_inICIO) AS DIAS,
(DAYOFYEAR(f.fecha_fin) - DAYOFYEAR(f.fecha_inicio))*df.cantidad*df.valor
AS total FROM factura f, detalle_factura df, articulo a
WHERE f.id_factura ='00001' AND df.id_articulo = a.id_articulo
AND f.id_factura =df.id_factura;

Resultado

Id_factura Nombre Valor_Unitario Cantidad Dias total


00001 Silla plástica 1200 4 4 19200
00001 Alfombras 2x 10 mts 1200 4 4 19200

Bibliografía
http://dev.mysql.com/doc/refman/5.0/es/using-date.html

Preparado por: Juan Carlos Pérez P. versión 1.0 5


www.esnips.com/web/desarrollo

You might also like