martes, 15 de junio de 2021

Obtener fecha de inicio y fin de mes en SQL SERVER

 Buenas noches queridos lectores, el día de hoy les explicaré como mostrar las fechas de inicio y fin de mes de manera automatizada, utilizando la función EOMONTH, cabe señalar que esta función esta disponible, a partir de 2012, por lo que si tienes SQL SERVER 2008, no se podrá utilizar, pues bien comencemos. 

Imaginemos que tenemos una lista inmensa de facturas, y nos interesa saber solo la facturación de mes actual, podríamos pensar que con un between entre el dia 1 y el día actual que estamos, sin embargo, tendríamos que modificar diario la fecha, o en su defecto, cambiar el between dependiendo si el mes tiene 30 o 31 días, sin mas preámbulo, pasemos a hacer lo que nos gusta.

Consideremos la siguiente tabla:

create table Facturas(

id int primary key identity,

cliente varchar(100),

fecha datetime,

monto money)





Una simple tabla de facturas que ilustrará el ejemplo, ahora me vamos a insertar datos

declare @cuenta int = 0

while @cuenta <=5000

BEGIN

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('CESAR AUGUSTO RAMIREZ GASPAR', (GETDATE() - @cuenta),450.00)

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('CESAR ALBERTO YAÑEZ MELENDREZ', (GETDATE() - @cuenta),323.00)

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('LEON FELIPE URIAS ROBLES', (GETDATE() - @cuenta),45234.00)

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('MAYRA CAROLINA REYES PIZANO', (GETDATE() - @cuenta),2568.23)

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('SALMA LIZBETH ZEPEDA RODRIGUEZ', (GETDATE() - @cuenta),17856.23)

       INSERT INTO Facturas(cliente, FECHA, monto) VALUES ('ROXANA ALEJANDRA ZARAGOZA MARQUEZ', (GETDATE() - @cuenta),17856.23)

       SET @CUENTA= @CUENTA + 1

       PRINT @CUENTA

END


La sentencia anterior nos creará 5006 datos, con los cuales trabajaremos, si hacemos un select a esa tabla, obtendremos un resultado como el siguiente:



Hay facturas desde el año 2007, y solo se requiere mostrar las facturas del mes actual, es decir junio de 2021.

Lo primero que tenemos que hacer, es obtener las fechas, tanto inicial como final que irán del día 01 de cada mes, hasta el 30 o 31 según sea el caso

DECLARE @FINMES AS DATE

SELECT @FINMES = EOMONTH(GETDATE())


Mediante esa función grabamos el ultimo día del mes, sea 28, 29, 30 o 31 en la variable @FINMES, mediante la función EOMONTH que puede recibir dos argumentos. El primero, sería la fecha a evaluar o sea, la fecha de la que nos mostraría el último día del mes, y otro parámetro que nos permite indicarle si suma a ese mes o resta, por lo cual en la variable FinMES, que solo recibe un parámetro, nos guarda el ultimo día del mes

DECLARE @INICIOMES AS DATE

PRINT @FINMES

SELECT @INICIOMES =  DATEADD(DAY,1,EOMONTH(GETDATE(),-1))


Tras saber lo anterior, con un poco de imaginación, podremos saber el primer día del mes, y para eso combinamos dos fórmulas EOMONTH y DATEADD.

La función DATEADD nos permite sumar días, meses o años a la fecha, en este caso se interpreta que le sumará un día, a el último día del mes pasado, por lo cual, el resultado será siempre día 01 de cada mes, la consulta completa quedaría así:

Únicamente, hay que ejecutar el query diario de ser posible sin cambiar ninguna fecha

DECLARE @FINMES AS DATE

SELECT @FINMES = EOMONTH(GETDATE())

DECLARE @INICIOMES AS DATE

PRINT @FINMES

SELECT @INICIOMES =  DATEADD(DAY,1,EOMONTH(GETDATE(),-1))

PRINT @INICIOMES

 

SELECT * FROM FACTURAS

WHERE fecha BETWEEN @INICIOMES AND @FINMES


Y el resultado del query sería el siguiente:



Hasta aquí el post queridos lectores, espero que este post haya sido de utilidad, cualquier duda que tengan con gusto la resolvemos. Si les gusto el post espero den un clic en algún anuncio patrocinado.


Saludos!!


No hay comentarios.:

Publicar un comentario

Catalogo de Clientes - Contpaqi Comercial

  Buenas a todos, en esta ocasión seguimos con el curso de Contpaqi ©  Comercial y veremos la opciones del catálogo de  Clientes , parte med...