En muchas circunstancias cuando trabajamos con fechas necesitamos determinar si un año es bisiesto o no lo es.

¿Qué es un año bisiesto?

Un año es el tiempo que tarda la Tierra en dar una vuelta completa alrededor del Sol. Ese tiempo es de 365 días, 5 horas, 48 minutos, 57 segundos.

Los años “normales” tienen 365 días, pero esas 5 horas, 48 minutos, 57 segundos, se van acumulando y al cabo de 4 años tenemos que suman 23 horas, 15 minutos, 36 segundos. No alcanzan a las 24 horas que tiene un día completo pero está muy cerca, por eso cada 4 años se agrega un día. Como el mes que tiene menos días es Febrero entonces ese día adicional se agrega a Febrero el cual pasa a tener 29 días y al año se lo denomina “bisiesto”.

Pero esos 44 minutos, 14 segundos que faltaban para tener un día de 24 horas se van acumulando y al cabo de 400 años tendremos 3,07176 días de más. Se podrían restar eso 3 días sobrantes pero eso nos complicaría la vida a todos. Si nos dicen que hoy es 5 de febrero y mañana será 2 de febrero eso nos hará la vida más difícil. ¿Entonces, hay una mejor solución? Pues sí, y es la siguiente: como cada 400 años hay 3 días adicionales, los años que terminan en 00 y cuyos dos primeros dígitos no son divisibles por 4 no serán bisiestos. Esto implica que cada 400 años habrá 97 años bisiestos, no 100 años bisiestos (que sería el caso si la Tierra girara alrededor del Sol en exactamente 365 días y 6 horas). Así que en lugar de estar restando días lo que se hace es no sumarlos cuando el año termina en 00 y los dos primeros dígitos no son divisibles por 4.

Por lo tanto, para que un año sea bisiesto se deben dar 2 condiciones:

  1.  Que sea divisible por 4
  2. Si termina en 00 que sus dos primeros dígitos también sean divisibles por 4. O en otras palabras, que sea divisible por 400.

Esto implica que los años 1700, 1800, 1900, 2100, 2200, 2300 no son bisiestos (porque no son divisibles por 400). Los años 1600, 2000, 2400, sí son bisiestos (porque son divisibles por 400).

¿Y aquí termina todo?

Pues no, como la Tierra se toma el tiempo que ella quiere en girar alrededor del Sol y no el tiempo que nos gustaría a los seres humanos entonces esos 0,07176 días se van acumulando y cada 5763 años forman un día más. Pero como ninguno de nosotros estaremos vivos dentro de 5000 años dejemos a los tipos que vivan en esa época preocuparse por sus años bisiestos, que nosotros ya tenemos bastante con los nuestros.

Un stored procedure para determinar si un año es bisiesto

CREATE PROCEDURE ES_BISIESTO(
   tnAno       SMALLINT)
RETURNS(
   ftcBisiesto CHAR(1))
AS
BEGIN

   ftcBisiesto = 'F';

   IF ((MOD(tnAno, 4) = 0 AND MOD(tnAno, 100) <> 0) OR MOD(tnAno, 400) = 0) THEN
      ftcBisiesto = 'T';

END;

Como puedes ver el stored procedure es muy simple. Devuelve ‘F’ si el año no es bisiesto o devuelve ‘T’ si el año sí es bisiesto.

La función MOD() devuelve el resto de una división entera. Si el resto es 0 eso significa que la división es exacta. Si el resto es distinto de 0 eso significa que la división no es exacta.

MOD(7, 2) es 1. ¿Por qué? porque 7 dividido 2 es 3 y el resto es 1. La función MOD() nos devuelve ese resto.

MOD(8, 2) es 0. ¿Por qué? porque 8 dividido 2 es 4 y el resto es 0. Por lo tanto MOD() nos devuelve 0.

Como se trata de un stored procedure ejecutable, para ejecutarlo debes escribir:

EXECUTE PROCEDURE ES_BISIESTO(2014)

Por supuesto que en tu caso reemplazarás al año 2014 por el año que te interesa saber si es bisiesto o no lo es.

Artículos relacionados:

MOD()

El índice del blog Firebird21

http://es.wikipedia.org/wiki/A%C3%B1o_bisiesto

Anuncios