2008-10-08 34 views
6

Específicamente MSSQL 2005.¿Cómo calculo el último día del mes en SQL?

+0

No estoy seguro de la respuesta que ha marcado como aceptado funciona acutally . Ejecutar '2009 30 de enero' a través de él y ver lo que ofrece? – MatBailie

+0

¿Hola? La respuesta aceptada, "no funciona" ... – MatBailie

+0

Dems, utilicé esto como inspiración para la solución que implementé, sin embargo, eso fue hace casi un año, así que no recuerdo exactamente lo que hice ... –

Respuesta

17

he aquí una solución que le da el último segundo del mes en curso. Puede extraer la parte de fecha o modificarla para devolver solo el día. He probado esto en SQL Server 2005.

select dateadd(s, -1, dateadd(mm, datediff(m, 0, getdate()) + 1, 0)); 

Para entender cómo funciona, tenemos que mirar a los dateadd() y datediff() funciones.

DATEADD(datepart, number, date) 
DATEDIFF(datepart, startdate, enddate) 

Si ejecuta sólo la llamada más interior para datediff(), se obtiene el número actual mes desde fecha y hora 0.

select datediff(m, 0, getdate()); 
1327 

La siguiente parte añade que el número de meses más el 1 al 0 marca de tiempo, que le da el punto de partida del próximo mes calendario.

select dateadd(mm, datediff(m, 0, getdate()) + 1, 0); 
2010-09-01 00:00:00.000 

Por último, el dateadd exterior() solo resta un segundo de la marca de tiempo a partir del próximo mes, que le da el último segundo del mes en curso.

select dateadd(s, -1, dateadd(mm, datediff(m, 0, getdate()) + 1, 0)); 
2010-08-31 23:59:59.000 


Esta vieja respuesta (abajo) tiene un error por el que no funciona en el último día de un mes que tiene más días que el mes que viene. Lo dejo aquí como una advertencia a los demás.

Añadir un mes para la fecha actual, y luego restar el valor devuelto por la función DÍA aplicado a la fecha actual utilizando las funciones DÍA y DATEADD.

dateadd(day, -day(getdate()), dateadd(month, 1, getdate())) 
+0

¿Qué pasa si las dos llamadas a la fecha dan respuestas en diferentes fechas? –

+0

Supongo que eso es posible. Tendría que declarar una variable para mantener la fecha de antemano. –

+0

No lo harán. Creamos informes que generan columnas de año, trimestre, mes y rundate (GetDate()) que demoran 30 segundos y el valor nunca cambia. – JeffO

3

Prueba esto:

DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0) 
+1

A menudo he descubierto que las personas no siguen la lógica de esto. Entonces, aunque parece ser correcto (donde la respuesta aceptada parece No ser correcta), no voy a dar +1. ¿Alguna posibilidad de que puedas editar la respuesta para dar la explicación? – MatBailie

0
DECLARE 
    @Now datetime, 
    @Today datetime, 
    @ThisMonth datetime, 
    @NextMonth datetime, 
    @LastDayThisMonth datetime 

SET @Now = getdate() 
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0) 
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0) 
SET @NextMonth = DateAdd(mm, 1, @ThisMonth) 
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth) 

A veces usted realmente no necesita el último día de este mes, pero con frecuencia lo que realmente quiere es describir el intervalo momento de este mes. Esta es la mejor manera de describir el intervalo momento de este mes:

WHERE @ThisMonth <= someDate and someDate < @NextMonth 
4
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000') 

Explicación:

Enfoque general: utilizar la funcionalidad temporal.

SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000' 

Estos son literales fecha y hora, siendo el primer gránulo de tiempo en el primer día y el último día, respectivamente, del mismo mes de 31 días. El mes elegido es completamente arbitrario.

SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP) 

Esta es la diferencia en meses enteros entre el primer día del mes de referencia y la marca de tiempo actual. Llamemos a esto @calc.

SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000') 

Esto añade @calc gránulos mes hasta el último día del mes de referencia, cuyo resultado es la fecha y hora actual 'redondeado' hasta el último día de su mes. Q.E. D.

+0

+1 para incluir una explicación :) – MatBailie

0

Para completar, en Oracle que haría algo así ...

select add_months(trunc(sysdate,'MM'),1) ... 

o

select last_day(sysdate)+1 ... 
0
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate))) 
2

Ellos son los puntos clave si usted puede conseguir el primer día de la corriente mes, último día del último mes y último día del mes actual.

A continuación se muestra el Paso a Paso manera de escribir consulta:

En Servidor fecha de inicio de SQL desde 1901/01/01 (Fecha 0) y hasta ahora cada mes puede ser identificado por un número. El mes 12 es el primer mes de 1902, significa enero. El mes 1200 es enero de 2001. De manera similar, cada día se puede asignar por número único, por ejemplo, la fecha 0 es 1901/01/01. Fecha 31 es 01/02/1901 en enero de 1901 se inicia desde 0.

Para averiguar primer día del mes actual (fecha actual o una fecha determinada)

  1. En primer lugar tenemos que comprobar cuántos meses han pasado desde la fecha 0 (1901/01/01). SELECT DATEDIFF (MM, 0, GETDATE())
  2. Agregar mismo número de meses hasta la fecha 0 (1901/01/01)

    SELECT DATEADD (MM, DATEDIFF (MM, 0, GETDATE()), 0)

a continuación, vamos a conseguir el primer día del mes en curso (fecha actual o una fecha determinada)

Para obtener Último día del último mes

tenemos que restar un segundo desde el primer día del mes en curso

SELECT DATEADD (SS, -1, DATEADD (MM, DATEDIFF (MM, 0, GETDATE()), 0))

Para acceder al último día del mes actual

Para conseguir el primer día del mes en curso primero nos registramos cuántos meses han pasado desde la fecha 0 (1901/01/01).Si agregamos otro mes con el total de meses desde la fecha 0 y luego agregamos el total de meses con la fecha 0, obtendremos el primer día del mes siguiente.

SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0) 

Si tenemos el primer día del mes próximo y luego el último día del mes actual, todo lo que necesitamos es restar un segundo.

SELECT DATEADD (SS, -1, DATEADD (MM, DATEDIFF (MM, 0, GETDATE()) + 1,0))

Hope que ayudaría.

1

Al usar SQL2005, no tiene acceso a una función útil EOMONTH(), por lo que debe calcularlo usted mismo.

Este simple voluntad función funciona de forma similar a EOMONTH

CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL) 
RETURNS DATETIME 
BEGIN 
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE())))) 
END 

Consulta a realizar:

SELECT dbo.endofmonth(DEFAULT) --Current month-end date 
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date 
Cuestiones relacionadas