En este articulo muestro algunas técnicas para el calculo de fechas, como por ejemplo, el primer día del mes, el último día del mes y la forma de extraer el día de una semana sin importar el lenguaje que tengamos configurado en el manejador.
Calcular el día sin hora
SELECT DATEADD(day,DATEDIFF(day, 0, GETDATE()),0);
Aquí utilizo la función DATEDIFF para extraer el numero de días entre la fecha de hoy y el 1 de enero de 1900, posteriormente a este resultado le agregamos el numero de días que han pasado del 1 de enero de 1900 a la fecha actual. El resultado de esto es el día actual sin fecha y hora.
Calcular el primer día del mes
Utilizando la lógica anterior podemos extraer el primer día del mes, pero cambiando day, por month.
SELECT DATEADD(month,DATEDIFF(month, 0, GETDATE()),0);
Calcular el último día del mes
Este es muy similar al anterior, solamente la anexamos un mes y al final le restamos un día.
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0) - 1;
Calcular el primero día del año
SELECT DATEADD(year,DATEDIFF(year, 0, GETDATE()),0);
Calcular el último día del año
SELECT DATEADD(year,DATEDIFF(year, 0, GETDATE()) + 1, 0) - 1;
Calcular el inicio de la hora de ejecución
SELECT DATEADD(hour,DATEDIFF(hour, 0, GETDATE()),0);
Calcular el último minuto de la hora
SELECT DATEADD( minute, -1, DATEADD( hour, DATEDIFF(hour, 0, GETDATE
()) +1, 0) );
Calcular el día de la semana
Una de las necesidades cuando se trabajan con fechas, es el calcular el día de la semana de una fecha. Esto generalmente se necesita cuando por ejemplo se requieren extraer los registros colocados el Lunes.
La manera más común de hacer esto es usando la función DATENAME:
SELECT columna1, columna2 from tabla
WHERE DATENAME (weekday,columnafecha) = 'Monday'
El problema de este tipo de query, es que estamos amarrados al lenguaje configurado de SQL Server, si este fuera un sistema global donde se tienen diferentes lenguajes, como italiano, español, etc ya no sería útil. La manera de corregir esto sería mediante el siguiente query:
SET DATEFIRST 1
SELECT columna1, columna2 from tabla
WHERE DATEPART(weekday,columnafecha) = 1
Cuando usemos esto no olvidemos definir nuesro primer día de la semana mediante el comando:
SET DATEFIRST 1
Esto es importante ya que cuando tenemos el lenguaje ingles, el primer día de la semana por default es el 7 (Domingo) y cuando tenemos el español es el 1 (Lunes). Si no definimos esto al hacer nuestra conexión, vamos a tener resultados diferentes entre lenguajes.
Podemos revisar que día tenemos mediante el comando:
SELECT @@DATEFIRST