Un store procedure que realice la inserción si y sólo si la edad supera la mínima, es relativamente sencillo; y si además se quiere un mensaje de salida, también.
Un modelo esquemático sería:
Código sql:
Ver originalDELIMITER $$
DROP PROCEDURE IF EXISTS `IngresarPersona` $$
CREATE PROCEDURE `IngresarPersona` (
IN VNOMBRE VARCHAR(50),
IN VAPELLIDO VARCHAR(50),
IN VFECHA_NAC DATE,
OUT RESPONSE VARCHAR(50))
BEGIN
IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
SET RESPONSE = 'EDAD MENOR A LA MINIMA';
ELSE
INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
SET RESPONSE = 'OK';
END IF;
END $$
DELIMITER ;
En la aplicación (dependiendo del lenguaje), se debe recuperar el parámetro de salida o bien, poner como sentencia final un select, para de esa forma recueprar el valor en la misma ejecución:
Código SQL:
Ver originalDELIMITER $$
DROP PROCEDURE IF EXISTS `IngresarPersona` $$
CREATE PROCEDURE `IngresarPersona` (
IN VNOMBRE VARCHAR(50),
IN VAPELLIDO VARCHAR(50),
IN VFECHA_NAC DATE)
BEGIN
DECLARE RESPONSE VARCHAR(50);
IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
SET RESPONSE = 'EDAD MENOR A LA MINIMA';
ELSE
INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
SET RESPONSE = 'OK';
END IF;
SELECT RESPONSE;
END $$
La función TIMESTAMPDIFF es muy eficiente para esto, ya que no tenemos que corroborar nada, solamente indicarle cuál unidad usaremos (YEAR en este caso), y sólo cuando supere valores enteros de un año, sumará uno. Hay que recordar que TIMESTAMPDIFF trabaja con valore DAATETIME, por lo que para evitar problemas de interpretación es conveiente convertir a DATE los valores usados, ya que de esa forma las fechas se recortan a la hora 00:00:00.
Mira esto:
Código SQL:
Ver originalmysql> SELECT
-> TIMESTAMPDIFF(YEAR, '2009-11-11', '2010-11-11') FECHA_1,
-> TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 09:59:59') FECHA_2,
-> TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 10:00:01') FECHA_3;
+---------+---------+---------+
| FECHA_1 | FECHA_2 | FECHA_3 |
+---------+---------+---------+
| 1 | 0 | 1 |
+---------+---------+---------+
1 ROW IN SET (0.00 sec)
mysql>