MySQL - Funcion con 3 tipos para seleccionar el formato de fecha

   
Vista:

Funcion con 3 tipos para seleccionar el formato de fecha

Publicado por Holopainen (3 intervenciones) el 11/06/2015 15:15:30
Hola, buenas, soy nuevo por aquí, así que ante todo un saludo.

Necesito crear una función con dos parametros tipo y fecha. Tipo podría ser un numero entre 1 y 3 que indicará el formato de fecha y nos devuelve la fecha como una cadena en castellano.

Pj haciendo lo siguiente, que nos devuelva la fecha segun el formato.

SELECT fechaf (1, CURDATE()) ; -----> 11/06/2015
SELECT fechaf (2, CURDATE()); -------> 11 de Junio de 2015

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Funcion con 3 tipos para seleccionar el formato de fecha

Publicado por leonardo_josue (81 intervenciones) el 11/06/2015 15:48:22
Hola Holopainen:

1
2
Necesito crear una función con dos parametros tipo y fecha. Tipo podría ser un numero entre 1 y 3 que indicará el
formato de fecha y nos devuelve la fecha como una cadena en castellano.

... y ¿cuál es el problema?. Ok, tienes muy claro qué es lo que necesitas hacer, entonces lo único que te falta es hacerlo... ¿qué fue lo que intentaste hacer? porque supongo que intentaste hacer algo ¿cierto?

Lo único que necesitas hacer es implementar la función DATE_FORMAT para cada uno de los casos, por ejemplo, para el primer caso sería hacer algo como esto:

1
2
3
4
5
6
7
mysql> SELECT CURDATE(), DATE_FORMAT(CURDATE(), '%d/%m/%Y');
+------------+------------------------------------+
| CURDATE()  | DATE_FORMAT(CURDATE(), '%d/%m/%Y') |
+------------+------------------------------------+
| 2015-06-11 | 11/06/2015                         |
+------------+------------------------------------+
1 row in set (0.00 sec)

Para el segundo de los casos, la única complicación que pudieras tener sería el poner los meses en español... puedes checar esta liga, estoy seguro que te será de utilizad.

http://lmgtfy.com/?q=nombres+de+meses+en+espa%C3%B1ol+con+mysql

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion con 3 tipos para seleccionar el formato de fecha

Publicado por Holopainen (3 intervenciones) el 11/06/2015 17:19:14
Buenas leonardo_josue, muchas gracias por la respuesta, la verdad es que estoy atascado precisamente a la hora
de realizar la consulta con las diferentes opciones. Tambien aclaro que estoy muy verde en esto de los triggers y funciones, estoy cursando a distancia así que tampoco quiero molestar mucho ni que en caso de yo no entender ciertas cosas que me las tengais que repetir.

He comentado en el anterior post el formato de fecha de 2 opciones , la tercera opción no la puse que es el formato de fecha con el día de la semana, por ejemplo "Jueves, 11 de Junio de 2015".

Como me pide que me duelva el resultado en español, no me queda mas remedio que pasar los dias a castellano como comentas.

Lo que hice fue...

Para los días de la semana:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION diasemana (fecha date) RETURNS varchar(15)
begin
CASE dayofweek(fecha)
    WHEN 1 THEN RETURN "Domingo";
    WHEN 2 THEN RETURN "Lunes";
    WHEN 3 THEN RETURN "Martes";
    WHEN 4 THEN RETURN "Miercoles";
    WHEN 5 THEN RETURN "Jueves";
    WHEN 6 THEN RETURN "Viernes";
    WHEN 7 THEN RETURN "Sabado";
    ELSE RETURN "Fecha erronea";
END CASE;
END;
$$ DELIMITER;



Hice lo mismo para los meses:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DELIMITER $$
CREATE FUNCTION meses(fecha date) RETURNS varchar(15)
begin
  case month(fecha)
    WHEN 1 THEN RETURN "Enero";
    WHEN 2 THEN RETURN "Febrero";
    WHEN 3 THEN RETURN "Marzo";
    WHEN 4 THEN RETURN "Abril";
    WHEN 5 THEN RETURN "Mayo";
    WHEN 6 THEN RETURN "Junio";
    WHEN 7 THEN RETURN "Julio";
    WHEN 8 THEN RETURN "Agosto";
    WHEN 9 THEN RETURN "Septiembre";
    WHEN 10 THEN RETURN "Octubre";
    WHEN 11 THEN RETURN "Noviembre";
    WHEN 12 THEN RETURN "Diciembre";
    ELSE RETURN "Fecha Erronea";
  END CASE;
END;
$$DELIMITER;




Ahora lo que no se es como hacer la selección de las opciones. Hago lo siguiente pero evidentemente solo me devuelve en el formato que está puesto, no se añadir las opciones y luego elegirlas en el select:



1
2
3
4
5
6
7
8
9
create procedure fechaf;
delimiter $$
create function fechaf (f date) returns varchar (20)
begin
return concat(day(f), " de ", meses(f), " del ", year(f));
end
$$ delimiter;
 
select fechaf(curdate());


Un saludo y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion con 3 tipos para seleccionar el formato de fecha

Publicado por leonardo_josue (81 intervenciones) el 11/06/2015 20:12:56
Hola de nuevo Holopainen:

En realidad, con lo que tienes, prácticamente has obtenido todo lo que necesitas... la parte "complicada" era lo de obtener los nombres en español, es correcto lo que haces, aunque también podrías haberlo hecho con la cláusula
lc_time_names, checa esta liga para leer al respecto:

https://dev.mysql.com/doc/refman/5.0/en/locale-support.html

ahora bien, volviendo a lo que tienes, puedes ajustar tu función fechaf para agregar un parámetro adicional y hacer un CASE, tal como lo haces con los días y las fechas, checa esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> DELIMITER $$
mysql> DROP FUNCTION IF EXISTS fechaf$$
Query OK, 0 rows affected (0.00 sec)
 
mysql> CREATE FUNCTION fechaf(formato INT, fecha DATE)
    -> RETURNS VARCHAR(40)
    -> BEGIN
    ->   CASE formato
    ->       WHEN 1 THEN RETURN DATE_FORMAT(fecha, '%d/%m/%Y');
    ->       WHEN 2 THEN RETURN 'formato 2';
    ->       WHEN 3 THEN RETURN CONCAT(diasemana(fecha), ", ", DAY(fecha), " de ", meses(fecha), " del ", YEAR(fecha));
    ->       ELSE RETURN 'error';
    ->    END CASE;
    -> END$$
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;

Observa que la función ahora recibe dos parámetros, un FORMATO que es de tipo entero y una FECHA de tipo DATE:

1
fechaf(formato INT, fecha DATE)

El parámetro FORMATO lo utilizas en un CASE-WHEN para listar todos los formatos que vas a codificar:

1
2
3
CASE formato
    ->       WHEN 1 ...
    ->       WHEN 2 ...

en el RETURN haces las operaciones necesarias para obtener el resultado que esperas. De tal manera que para obtener las fechas, lo unico que tienes que hacer es algo como esto;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT CURDATE(), fechaf(1, CURDATE());
+------------+----------------------+
| CURDATE()  | fechaf(1, CURDATE()) |
+------------+----------------------+
| 2015-06-11 | 11/06/2015           |
+------------+----------------------+
1 row in set (0.00 sec)
 
 
mysql> SELECT CURDATE(), fechaf(3, CURDATE());
+------------+------------------------------+
| CURDATE()  | fechaf(3, CURDATE())         |
+------------+------------------------------+
| 2015-06-11 | Jueves, 11 de Junio del 2015 |
+------------+------------------------------+
1 row in set (0.00 sec)

Observa que cuando se envia un fomato 2 o 4, NO TE ESTÁ REGRESANDO UNA FECHA, porque no está implementado, o simplemente porque quieres regresar otra cosa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT CURDATE(), fechaf(2, CURDATE());
+------------+----------------------+
| CURDATE()  | fechaf(2, CURDATE()) |
+------------+----------------------+
| 2015-06-11 | formato 2            |
+------------+----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CURDATE(), fechaf(4, CURDATE());
+------------+----------------------+
| CURDATE()  | fechaf(4, CURDATE()) |
+------------+----------------------+
| 2015-06-11 | error                |
+------------+----------------------+
1 row in set (0.00 sec)

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion con 3 tipos para seleccionar el formato de fecha

Publicado por Holopainen (3 intervenciones) el 11/06/2015 22:07:35
Me funciona perfecto, muchisimas gracias por la explicación y tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar