viernes, 15 de noviembre de 2013

DATEPART() + @@DATEFIRST = ?

En uno de esos días en los que busco como complicarme la vida me pregunté ¿Habrá una forma de saber el día de la semana de una fecha sin preocuparme por la configuración de SET DATEFIRST?

Imagen 1
Entonces decidí ver la diferentes valores que podían tomar los días de la semana para los valores posibles que puede tomar SET DATEFIRST. El resultado es la matriz que se muestra en la imagen 1.

Si configuramos SET DATEFIRST a 1 entonces el primer día de la semana será lunes, es decir que DATEPART(dw, ) nos devolverá 1 para lo lunes y  7 para los domingos.

Ahora si configuramos SET DATEFIRST a 2 entonces el primer día de la semana será martes, entonces DATEPART(dw, ) nos devolverá el 1 para los martes, 6 para los domingos y 7 para los lunes.



Si sumo los diferentes valores que puede tomar un lunes con los diferentes valores que toma la variable @@DATEFIRST tenemos lo siguiente.

@@DATEFIRST + DATEPART(dw, )
==> 1 + 1 = 2
==> 2 + 7 = 9
==> 3 + 6 = 9
==> 4 + 5 = 9
==> 5 + 4 = 9
==> 6 + 3 = 9
==> 7 + 2 = 9

Obtengo que para los lunes hay dos posibles valores 2 y 9.

Repito el mismo proceso para los miércoles:
@@DATEFIRST + DATEPART(dw, )
==> 1 + 3 = 4
==> 2 + 2 = 4
==> 3 + 1 = 4
==> 4 + 7 = 11
==> 5 + 6 = 11
==> 6 + 5 = 11
==> 7 + 4 = 11

Para los miércoles tengo dos posibles valores 4 y 11.

Ahora lo hago para los domingos :
@@DATEFIRST + DATEPART(dw, )
==> 1 + 7 = 8
==> 2 + 6 = 8
==> 3 + 5 = 8
==> 4 + 4 = 8
==> 5 + 3 = 8
==> 6 + 2 = 8
==> 7 + 7 = 8

Para los domingos solo hay un posible valor 8.

Concluyo que si el resultado de sumar @@DATEFIRST + DATEPART(dw, ) es:
  1. 2 ó 9 la fecha es un lunes
  2. 3 ó 10 la fecha es un martes
  3. 4 ó 11 la fecha es un miércoles
  4. 5 ó 12 la fecha es un jueves
  5. 6 ó 13 la fecha es un viernes
  6. 7 ó 14 la fecha es un sábado
  7. 8 la fecha es un domingo.
De esta forma no me preocupo de tener que usar SET DATEFIRST, sobre todo cuando toca modificar o agregar un subproceso a un proceso muy complejo. También me evito la necesidad que al final del subproceso de a restablecer SET DATEFIRST a su valor inicial.

No hay comentarios:

Publicar un comentario

´