Trucos Transact-SQL - Próximo día habil

2 - Próximo día habil

[editar]
Tutorial creado por Mononeurona. Extraido de: http://www.mononeurona.org/index.php?idp=541
27 de Octubre de 2005
Hay un método trivial de encontrar el próximo día hábil a partir del día de hoy: basta sumarle a la fecha dos días si hoy es sábado, o un día si hoy es domingo. Lo que no es trivial de ver es que hay una aritmetización de este procedimiento que evita el uso de condicionales.

Sea f: D?N la función de días de la semana a números que vale 2 en sábado, 1 en domingo y 0 para el resto de la semana. Entonces,

select @fecha = dateadd(day, f(datepart(weekday, @fecha)), @fecha)

actualiza @fecha para forzarla a caer en día hábil. ¿Cómo encontramos esa función?

Los polinomios son las funciones más simples que podemos usar. Experimentando un poco con una calculadora, encontramos que y = x2 / 18 es la función que necesitamos: para 0 ? x ? 4, es y < 1; para x = 5, es y < 2; y para x = 6, tenemos que y = 2, exactamente. Con unos cuantos masajes, estamos listos.

El primer paso es eliminar la parte fraccionaria de nuestra función: eso se logra fácilmente usando floor(). El segundo, y más importante paso es "correr la semana" de tal forma de que el sábado corresponda a 6, el domingo a 5, el lunes a 4 y así sucesivamente hasta el viernes que vale 0. Sumarizando en una tabla, lo que queremos es lo siguiente:

|| Día || D || L || Ma || Mi || J || V || S ||
|| datepart(weekday) || 1 || 2 || 3 || 4 || 5 || 6 || 7 ||
|| Valor Buscado || 5 || 4 || 3 || 2 || 1 || || 6 ||

Nuestra sospecha inicial es que es una transformación módulo 7 del datepart(weekday). Nuestra segunda sospecha es que, como va hacia atrás (es decir, es decreciente con el día), involucra restar el día de la semana de algo. Para que el día 6 (viernes) corresponda a 0, tiene que ser un múltiplo de 7. Ese "algo" del que queremos restar es, entonces, 6 + 7 = 13. La transformación que buscamos es (13 - datepart(weekday, @fecha))%7.

Reemplazando en el argumento, la función completa queda:

select @fecha = dateadd(day,
floor(power(
(13 - datepart(weekday, @fecha))%7, 2)/18),
@fecha)

Podemos sumarizar el funcionamiento de esta función mediante esta tabla:

|| Día || D || L || Ma || Mi || J || V || S ||
|| Día Hábil || L || L || Ma || Mi || J || V || L ||

Con el mismo criterio, la función que devuelve el día de mañana o el próximo día hábil es:

select @fecha = dateadd(day,
floor(power(
(12 - datepart(weekday, @fecha))%7, 2)/18) + 1,
@fecha)

El resultado es el siguiente:

|| Día || D || L || Ma || Mi || J || V || S ||
|| Próximo Día Hábil || L || Ma || Mi || J || V || L || L ||

ESTA FUNCION PRESENTA PROBLEMAS CUANDO CAMBIO LA CONFIGURACION DEL LENGUAJE DEL USUARIO QUE LA EJECUTA A ESPAÑOL(SPANISH)
[editar]

10 opiniones

Agradecimiento.

Interesante eh.
Como hacer los programas.

Todo los programas de sql con todo los programas de php,asp. Deben de ser mas complejas.
Buenisimo.

Felicito a los aportadores de este articulo, pero de igual manera me encantaria que lo ampliasen.
Aprendiendo trasact-sql.

Gracias

por favor quiero encontrar un libro o un tutorial de todo el lenguaje transat-sql

podria por favor colaborarme.
Genial.

Yo había construido una función para agrupar por horas, pero esto es mucho mejor, ya que los cálculos son rapidísimos. Gracias por la idea.
1 2 | siguiente >

Tutoriales relacionados con 'Trucos Transact-SQL'

Varios de los ejemplos aquí presentados usan tablas ''abstractas'' A y B. Las definiciones son:... Más »

Autor y licencia de 'Trucos Transact-SQL'


Tutorial de Mononeurona. Extraido de: http://www.mononeurona.org/index.php?idp=541 CopyLeft
Este trabajo está licenciado bajo la Creative Commons License. 1999-2005 © :: MonoNeurona.org ::
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.