Específicamente MSSQL 2005.¿Cómo calculo el último día del mes en SQL?
Respuesta
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()))
¿Qué pasa si las dos llamadas a la fecha dan respuestas en diferentes fechas? –
Supongo que eso es posible. Tendría que declarar una variable para mantener la fecha de antemano. –
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
Algunos enlaces a posibles respuestas:
Prueba esto:
DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
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
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
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.
+1 para incluir una explicación :) – MatBailie
Para completar, en Oracle que haría algo así ...
select add_months(trunc(sysdate,'MM'),1) ...
o
select last_day(sysdate)+1 ...
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))
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)
- En primer lugar tenemos que comprobar cuántos meses han pasado desde la fecha 0 (1901/01/01). SELECT DATEDIFF (MM, 0, GETDATE())
- 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.
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
- 1. Cómo obtener el último día del mes
- 2. Obtener el último día del mes?
- 3. Primer y último día del mes actual
- 4. cálculo del último día del mes
- 5. ¿Cómo obtengo el último día del mes utilizando SQL Reporting Services
- 6. Último día del mes en .NET
- 7. ¿Cómo puedo obtener el último día del mes en C#?
- 8. Devolver el último día de cada mes con SQL
- 9. ¿Cómo se encuentra el último día del mes?
- 10. Obtener el último día del mes anterior en Oracle Función
- 11. programador de cuarzo: se ejecuta el último día del mes
- 12. Javascript a fecha del último día del mes anterior
- 13. ¿Cómo obtengo el último día de un mes?
- 14. Buscar el primer y último día del mes calendario anterior en SQL Server Reporting Services (VB.Net)
- 15. Seleccione el primer día del mes anterior en (DB2) SQL
- 16. ¿Cómo obtener el día del mes?
- 17. Calcule el último día de la semana de un mes
- 18. Calcule el último día del trimestre
- 19. ¿Cuál es la mejor manera de obtener el primer y el último día del mes pasado?
- 20. SQL - Obtener Día numérica de mes/trimestre
- 21. Buscar el nombre del día por año, mes y día
- 22. Detectando el tercer viernes en el último mes del trimestre
- 23. ¿Cómo puedo obtener el primer y último día del mes con DateTime de Perl?
- 24. NSDate para el primer día del mes
- 25. primer día del mes anterior en javascript
- 26. día foreach en el mes
- 27. cómo obtener el día del mes en javascript
- 28. Buscar primero y último día del último trimestre en ORACLE
- 29. Obtenga las fechas del primer y último día del mes anterior en C#
- 30. jQuery UI DatePicker - Deshabilitar todos los días excepto el último día del mes
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
¿Hola? La respuesta aceptada, "no funciona" ... – MatBailie
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 ... –