Sobre MySQL

Convertir formato fecha dd/mm/yyyy en nuestro Excel a yyyy-mm-dd para nuestro MySQL.

Hola Colegas,

En ocasiones tenemos que nuestros clientes nos envían un archivo en Excel y topamos con la suerte de que el formato enviado de una fecha X de ese lote de información, viene en dd/mm/yyyy, y necesitamos INSERTAR esos registros que pueden ser miles en nuestra base de datos MySQL, y dicho campo tiene formato yyyy-mm-dd.

Pues la solución es muy sencilla!, adicionamos una columna en nuestro Excel ( junto a la fecha) y aplicamos la siguiente fórmula:

= TEXT(DATE(RIGHT(G2,4),MID(G2,4,2),LEFT(G2,2)),"YYYY-MM-DD")

Nuestra nueva columna debería quedar con el formato: yyyy-mm-dd  y lista para cargar a nuestra tabla.

Una forma muy sencilla para algo que a veces nos quiebra la cabeza.

formatofecha

Buena suerte.

Elaboración de Store Procedure en MySQL – Números Aleatorios

Buenas Colegas,

Esta semana tuve que implementar un requerimiento y me pareció interesante compartirlo, ya que muchas veces nos puede ser mas sencillo implementar el algoritmo a nivel de Base de datos.

El caso es el siguiente: debía confeccionar un formulario para ingresar los datos de la persona en mi sistema, en un input de ese registro/formulario se debía especificar cantidad de cupones (números aleatorios) que se debian crear en función de ese registro que ingresaba al sistema, entonces pensé!, esto no lo voy hacer por un script de programación, voy a buscar otra alternativa, y opté por generarlo a nivel de un STORE PROCEDURE en base de datos y así no modifiqué mucho mi código del sistema.

Les comparto el algoritmo en lenguaje SQL-STATEMENT a nivel de MySQL.

---------------------
BEGIN

 DECLARE contador INT UNSIGNED DEFAULT 0;
 DECLARE numCupon BIGINT SIGNED DEFAULT 0;
 DECLARE cantidaEncontrado INT;

 #TRUNCATE table cupones;

 START TRANSACTION;

 WHILE contador < CantidadCupones DO
 /* Esta es mi funcion que genera el Numero Aleatorio*/
 SET numCupon = numero_aleatorio();

 SET cantidaEncontrado = (SELECT COALESCE(COUNT(*),0) FROM cupones WHERE numCupon = codigo_cupon);

 IF (cantidaEncontrado = 0) THEN
 /*
 El SP recibe por parametro 2 variables/parametros:
 Letra: Quiero generar mis numeros aleatorios y le contacteno un a letra.
 IdActivacion: Es la llave Forenea al registro de la persona.
 */
 INSERT INTO cupones (codigo_cupon,fk_activacion) VALUES ( CONCAT(numCupon,Letra),IdActivacion);

 SET contador=contador+1;
 
 END IF;

 END WHILE;

COMMIT;

END
--------------------------

Por otro lado esta es mi función llamada numero_aleatorio() para crear el numero random.

BEGIN
	/* Es una función y retorna un INT*/
	RETURN FLOOR((1111+RAND()) * (9999-1111)) + 100;

END

 

 

Obtener la Mayor Fecha de un conjunto de datos en MySQL

Hola Colegas, comparto el siguiente código SQL en MySQL para un caso interesante que tuve que resolver para un proceso que me solicitaron en un requerimiento de software. El requerimiento era que el sistema debia enviar un recordatorio por correo electrónico a todos aquellos pacientes que su última visita médica fuese hace un año exacto. La fórmula basicamente vendría siendo HOY – 1 año y verificar que la fecha concidiera con la ultima visita del paciente.

En primera instancia realicé el SQL que me devolviera la lista de pacientes con su última visita médica.

SELECT
	fk_id_paciente,
	MAX(DATE_FORMAT(fecha_cita, '%Y-%m-%d')) AS ULTIMA_VISITA
FROM
	cita
WHERE
	1
GROUP BY
	fk_id_paciente;

Luego, realicé otro SQL que anidara el SQL anterior “como una tabla temporal” para poder realizar el calculo/formula de la fecha actual menos un año y verificara el resultado de mi primer SQL junto con el id del paciente. De manera que al unir los dos SQL obtuve el resultado que andaba buscando.

SELECT * FROM pacientes, 

	(
		SELECT MAX(DATE_FORMAT(fecha_cita,'%Y-%m-%d')) AS ULTIMA_VISITA,
					 fk_id_paciente 
					 FROM cita 
					 WHERE 
1    
		GROUP BY fk_id_paciente
) as TMP 

WHERE 
DATE_ADD(CURDATE(),INTERVAL -1 YEAR) = TMP.ULTIMA_VISITA 
AND TMP.fk_id_paciente = pacientes.id_pacientes;

Buena Suerte!

 

Buenas Prácticas de Esquemas de Seguridad para MySQL 4.1,5.0,5.1

Recientemente fuimos participes de un proceso de Auditoría, durante el proceso fueron evaluados unos equipos que brindaban servicios a uno de nuestros principales clientes.Surgieron muchas recomendaciones importantes como lo es usual en estas evaluaciones.

Me llamó mucho la atención el documento de resultados y que estaba propiamente vinculado con el tema de Buenas Prácticas sobre la configuración de Seguridad para MySQL 4.1, 5.0, y 5.1 de la versión Community Edicion. Documento proporcionado por la organización http://cisecurity.org/,

Aqui les dejo el link del Benchmark v1.0.1

http://benchmarks.cisecurity.org/downloads/show-single/?file=mysql.101

Sin duda alguna conocer de estos temas tan importantes cuando realizamos configuración de equipos (servidores) mitiga cualquier hueco de seguridad en nuestras plataformas,  contar con una herramienta o varias herramientas que nos diagnostique como se encuentran nuestros servidores (si contamos con mas de uno), no deja de ser una tarea de más…, si así lo queremos ver; si no mas bien mejora nuestros procesos de calidad y esquemas de seguridad.

Como obtener el primer y último día de una semana específica – SQL MySQL

Hola, un compañero de Trabajo ( Francisco Jiménez) realizó el siguiente aporte y me pareció interesanta compartirlo:

SQL para obtener el primer y último día de una semana específica:


[php]
SET @dia = ‘2013-10-26’;
SELECT WEEKOFYEAR(@dia),
DATE_FORMAT(@dia,"%Y-%m-%d") AS "Fecha",
CONCAT(ELT(WEEKDAY(@dia) + 1, ‘Lunes’, ‘Martes’, ‘Miercoles’, ‘Juevez’, ‘Viernes’, ‘Sabado’, ‘Domingo’)) AS "DiaSemana",
CONCAT(ELT(MONTH(@dia), ‘Enero’, ‘Febrero’, ‘Marzo’, ‘Abril’, ‘Mayo’, ‘Junio’, ‘Julio’, ‘Agosto’, ‘Septiembre’, ‘Octubre’, ‘Noviembre’, ‘Diciembre’)) AS "Mes",
DAYOFWEEK(@dia) AS "numDiaSemana", DATE_ADD(@dia, INTERVAL -(DAYOFWEEK(@dia)-1) DAY) AS "primerDiaSemana",
DATE_ADD(@dia, INTERVAL (7-DAYOFWEEK(@dia)) DAY) AS "ultimoDiaSemana"
[/php]

Espero que les pueda ser útil.

Cómo crear una tarea automática de respaldos de base de datos MySQL en la nube

A continuación le voy a mostrar como configurar un script a nivel de Linux para que puedas utilizarlo como una tarea automática o lo que se conoce como cron job para sus respaldos diarios, semanales y/o mensuales, todo depende de como lo deseen configurar en el CRONTAB de su servidor.

Paso 1:

Debemos crear un script "backup_my_database.sh" por medio de nuestro shell o editor (vi, nano, etc) con la siguiente instrucción o código

#!/bin/sh
date=`date -I`
mysqldump -h DB_HOST -u DB_USER -p'DB_PASSWORD' DB_NAME > YOUR_WEB_ROOT/db_backup-$date.sql
gzip -f YOUR_WEB_ROOT/db_backup-$date.sql

Importante debes remplazar todo lo que tengo en Mayúscula por sus valores equivalente de acuerdo a los accesos y configuración que tienes para accesar a tu base de datos.

DB_HOST: Debe utilizar el valor que le brinda su proveedor de hospedaje para conectarte a tu base de datos un ejemplo de esto es: miempresa.com o puede ser una IP (190.x.x.x) o bien si es de godaddy como acceso remoto es un nombre largo algo como lo siguiente: exhost.db.8727219.hostedresource.com

DB_USER: Usuario de conexion a tu base de datos.

DB_PASSWORD: Password o contraseña que le asigno su proveedor o creaste en el momento que fue realizada la configuración de la base de datos.

DB_NAME: Nombre del esquema definido para su base de datos, ejemplo: db_empleados

YOUR_WEB_ROOT: Esto es muy importante pues es la ubicación física de su computador y/o servidor donde quedará almacenado el archivo "db_backup-$date.sql.gz".

El valor de $date, es remplazado por la fecha actual cuando se realiza el proceso.

Paso 2:

Puedes ubicar este archivo "backup_my_database.sh" dentro de los directorios de tu CronJOB en linux, no olvides darle privilegios de ejecución con chmod 755.

Para probar si el script funciona correctamente, ingresas a tu consola shell, te ubicas en el directorio donde creo el archivo y puedes ejecutarlo mediante la instrucción:

shell: ./backup_my_database.sh