ultimo - sql server last day of month
Obtenga el último día del mes en SQL (18)
Necesito obtener el último día del mes como una fecha en SQL. Si tengo el primer día del mes, puedo hacer algo como esto:
DATEADD(DAY, DATEADD(MONTH,''2009-05-01'',1), -1)
Pero, ¿alguien sabe cómo generalizarlo para que pueda encontrar el último día del mes para una fecha determinada?
Aquí está mi versión. No se requiere manipulación o fundición de cadenas, solo una llamada a las DATEADD
, YEAR
y MONTH
:
DECLARE @test DATETIME
SET @test = GETDATE() -- or any other date
SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
Basado en las declaraciones:
SELECT DATEADD(MONTH, 1, @x) -- Add a month to the supplied date @x
y
SELECT DATEADD(DAY, 0 - DAY(@x), @x) -- Get last day of month previous to the supplied date @x
¿Qué tal si agregamos un mes hasta la fecha @x y luego recuperamos el último día del mes anterior a ese (es decir, el último día del mes de la fecha provista)?
DECLARE @x DATE = ''20-Feb-2012''
SELECT DAY(DATEADD(DAY, 0 - DAY(DATEADD(MONTH, 1, @x)), DATEADD(MONTH, 1, @x)))
Nota: Esta fue una prueba usando SQL Server 2008 R2
Desde SQL Server 2012 puede usar la función EOMONTH .
Devuelve el último día del mes que contiene la fecha especificada, con un desplazamiento opcional.
Sintaxis
EOMONTH ( start_date [, month_to_add ] )
¿Cómo ... puedo encontrar el último día del mes para una fecha determinada?
SELECT EOMONTH(@SomeGivenDate)
Escribí la siguiente función, funciona.
Devuelve el tipo de datos de fecha y hora. Cero hora, minuto, segundo, milisegundos.
CREATE Function [dbo].[fn_GetLastDate]
(
@date datetime
)
returns datetime
as
begin
declare @result datetime
select @result = CHOOSE(month(@date),
DATEADD(DAY, 31 -day(@date), @date),
IIF(YEAR(@date) % 4 = 0, DATEADD(DAY, 29 -day(@date), @date), DATEADD(DAY, 28 -day(@date), @date)),
DATEADD(DAY, 31 -day(@date), @date) ,
DATEADD(DAY, 30 -day(@date), @date),
DATEADD(DAY, 31 -day(@date), @date),
DATEADD(DAY, 30 -day(@date), @date),
DATEADD(DAY, 31 -day(@date), @date),
DATEADD(DAY, 31 -day(@date), @date),
DATEADD(DAY, 30 -day(@date), @date),
DATEADD(DAY, 31 -day(@date), @date),
DATEADD(DAY, 30 -day(@date), @date),
DATEADD(DAY, 31 -day(@date), @date))
return convert(date, @result)
end
Es muy fácil de usar. 2 ejemplo:
select [dbo].[fn_GetLastDate](''2016-02-03 12:34:12'')
select [dbo].[fn_GetLastDate](GETDATE())
Esto funciona para mí, usando Microsoft SQL Server 2005:
DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,''2009-05-01'')+1,0))
Intenta ejecutar la siguiente consulta, te dará todo lo que quieras :)
Declare @a date =dateadd(mm, Datediff(mm,0,getdate()),0)
Print(''First day of Current Month:'')
Print(@a)
Print('''')
set @a = dateadd(mm, Datediff(mm,0,getdate())+1,-1)
Print(''Last day of Current Month:'')
Print(@a)
Print('''')
Print(''First day of Last Month:'')
set @a = dateadd(mm, Datediff(mm,0,getdate())-1,0)
Print(@a)
Print('''')
Print(''Last day of Last Month:'')
set @a = dateadd(mm, Datediff(mm,0,getdate()),-1)
Print(@a)
Print('''')
Print(''First day of Current Week:'')
set @a = dateadd(ww, Datediff(ww,0,getdate()),0)
Print(@a)
Print('''')
Print(''Last day of Current Week:'')
set @a = dateadd(ww, Datediff(ww,0,getdate())+1,-1)
Print(@a)
Print('''')
Print(''First day of Last Week:'')
set @a = dateadd(ww, Datediff(ww,0,getdate())-1,0)
Print(@a)
Print('''')
Print(''Last day of Last Week:'')
set @a = dateadd(ww, Datediff(ww,0,getdate()),-1)
Print(@a)
La función LAST_DAY funciona muy bien para esto.
Editar: En realidad, como se menciona en los comentarios, probablemente no sea así para todos los SQL. Dejaré la publicación en la posibilidad de que alguien que esté buscando una respuesta MySQL / Oracle tropiece con ella.
Del manual de referencia de mysql :
LAST_DAY(date)
Toma un valor de fecha o de fecha y hora y devuelve el valor correspondiente para el último día del mes. Devuelve NULL si el argumento no es válido.
mysql> SELECT LAST_DAY(''2003-02-05'');
-> ''2003-02-28''
mysql> SELECT LAST_DAY(''2004-02-05'');
-> ''2004-02-29''
mysql> SELECT LAST_DAY(''2004-01-01 01:01:01'');
-> ''2004-01-31''
mysql> SELECT LAST_DAY(''2003-03-32'');
-> NULL
LAST_DAY () está disponible a partir de MySQL 4.1.1.
Mis 2 centavos:
select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,''2008-02-12'')-1)),''2008-02-12'')))
Raj
Para SQL Server 2012 o superior use EOMONTH para obtener la última fecha del mes
Consulta SQL para mostrar la fecha de finalización del mes actual
DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate) AS CurrentMonthED
Consulta SQL para mostrar la fecha de finalización del mes siguiente
DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate, 1 ) AS NextMonthED
Puede obtener los días de la fecha utilizando la función DAY() :
dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
Sé que esta es una vieja pregunta, pero aquí hay otra solución que funciona para mí
SET @dtDate = "your date"
DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0))
Y si alguien está buscando ejemplos diferentes aquí hay un enlace http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/
Espero que esto ayude a alguien más. rocas de !!!!
Si lo necesita con frecuencia, envuélvalo en un TVF en línea, que es muy rápido:
Solo extienda su fórmula un poco:
dateadd(day, -1,
dateadd(month, 1,
cast(month(''5/15/2009'') as varchar(2)) +
''/1/'' +
cast(year(''5/15/2009'') as varchar(4)))
Tome una fecha base que es el 31 de algún mes, por ejemplo, ''20011231''. Luego usa el
siguiente procedimiento (He dado 3 ejemplos idénticos a continuación, solo difiere el valor @dt).
declare @dt datetime;
set @dt = ''20140312''
SELECT DATEADD(month, DATEDIFF(month, ''20011231'', @dt), ''20011231'');
set @dt = ''20140208''
SELECT DATEADD(month, DATEDIFF(month, ''20011231'', @dt), ''20011231'');
set @dt = ''20140405''
SELECT DATEADD(month, DATEDIFF(month, ''20011231'', @dt), ''20011231'');
Usando SQL Server, aquí hay otra forma de encontrar el último día del mes:
SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE()))
WinSQL para obtener el último día del último mes (es decir, hoy es 2017-02-09, devoluciones 2017-01-31: Seleccione dateadd (día, -día (hoy ()), hoy ())
WinSQL: quería devolver todos los registros del mes pasado:
where DATE01 between dateadd(month,-1,dateadd(day,1,dateadd(day,-day(today()),today()))) and dateadd(day,-day(today()),today())
Esto hace lo mismo:
where month(DATE01) = month(dateadd(month,-1,today())) and year(DATE01) = year(dateadd(month,-1,today()))
usando sql server 2005, esto funciona para mí:
select dateadd(dd,-1,dateadd(mm,datediff(mm,0,YOUR_DATE)+1,0))
Básicamente, obtienes la cantidad de meses desde el comienzo del tiempo (SQL Server) para YOUR_DATE. Luego, agregue uno para obtener el número de secuencia del próximo mes. Luego, agregue este número de meses a 0 para obtener una fecha que sea el primer día del mes siguiente. A partir de esto, resta un día para llegar al último día de YOUR_DATE.