web-dev-qa-db-fra.com

Obtenez le dernier jour du mois en SQL

Je dois obtenir le dernier jour du mois comme date en SQL. Si j'ai le premier jour du mois, je peux faire quelque chose comme ceci:

DATEADD(DAY, DATEADD(MONTH,'2009-05-01',1), -1)

Mais est-ce que quelqu'un sait comment généraliser pour que je puisse trouver le dernier jour du mois pour une date donnée?

39
Byron Whitlock

Voici ma version. Aucune manipulation de chaîne ni transtypage requis, un seul appel aux fonctions DATEADD, YEAR et MONTH:

DECLARE @test DATETIME
SET @test = GETDATE()  -- or any other date

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
54
LukeH

Depuis SQL Server 2012, vous pouvez utiliser la fonction EOMONTH .

Renvoie le dernier jour du mois contenant la date spécifiée, avec un décalage optionnel.

Syntaxe

EOMONTH ( start_date [, month_to_add ] ) 

Comment ... je peux trouver le dernier jour du mois pour une date donnée?

SELECT EOMONTH(@SomeGivenDate)
52
Martin Smith

Vous pouvez obtenir les jours de la date en utilisant la fonction DAY ()

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
13
jamuraa

Je sais que c'est une vieille question, mais voici une autre solution qui fonctionne pour moi 

SET @dtDate = "your date"
DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0))

Et si quelqu'un cherche différents exemples, voici un lien http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous -suivant/

J'espère que cela aide quelqu'un d'autre . Stackoverflow Rocks !!!! 

4
Moy

Sur la base des déclarations: 

SELECT DATEADD(MONTH, 1, @x)           -- Add a month to the supplied date @x

et

SELECT DATEADD(DAY,  0 - DAY(@x), @x)  -- Get last day of month previous to the supplied date @x

que diriez-vous d’ajouter un mois à la date @x et d’extraire le dernier jour du mois précédent

DECLARE @x  DATE = '20-Feb-2012' 
SELECT DAY(DATEADD(DAY,  0 - DAY(DATEADD(MONTH, 1, @x)), DATEADD(MONTH, 1, @x)))

Remarque: ce test a été effectué avec SQL Server 2008 R2.

3
Stu

Prolongez un peu votre formule:

dateadd(day, -1,
    dateadd(month, 1,
        cast(month('5/15/2009') as varchar(2)) + 
        '/1/' + 
        cast(year('5/15/2009') as varchar(4)))
2
Eric

Pour SQL Server 2012 ou version ultérieure, utilisez EOMONTH pour obtenir la dernière date du mois 

Requête SQL pour afficher la date de fin du mois en cours

DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate) AS CurrentMonthED

Requête SQL pour afficher la date de fin du mois prochain

DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate, 1 ) AS NextMonthED
2
Satinder singh

Fonctionne sur le serveur SQL

Declare @GivenDate datetime
SET @GivenDate = GETDATE()

Select DATEADD(MM,DATEDIFF(MM, 0, @GivenDate),0) --First day of the month 

Select DATEADD(MM,DATEDIFF(MM, -1, @GivenDate),-1) --Last day of the month
1
Sri

En utilisant SQL Server, voici un autre moyen de trouver le dernier jour du mois: 

SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE()))
1
Trilok

WinSQL: Je voulais renvoyer tous les enregistrements du mois dernier:

where DATE01 between dateadd(month,-1,dateadd(day,1,dateadd(day,-day(today()),today()))) and dateadd(day,-day(today()),today())

Cela fait la même chose:

where month(DATE01) = month(dateadd(month,-1,today())) and year(DATE01) = year(dateadd(month,-1,today()))
1
David

WinSQL obtiendra le dernier jour du mois dernier (c'est-à-dire que si aujourd'hui est le 09-02-2017, renvoie le 2017-01-31: Sélectionnez dateadd (jour, jour (aujourd'hui ()), aujourd'hui ()).

1
David

Essayez de lancer la requête suivante, elle vous donnera tout ce que vous voulez :)

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)
1
LONG

J'ai écrit la fonction suivante, ça marche.

Il retourne le type de données datetime. Zéro heure, minute, seconde, millisecondes. 

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

C'est très facile à utiliser. 2 exemple:

select [dbo].[fn_GetLastDate]('2016-02-03 12:34:12')

select [dbo].[fn_GetLastDate](GETDATE())
0
Başar Kaya

Mes 2 centimes:

select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12')))

Raj

0
Raj

en utilisant SQL Server 2005, cela fonctionne pour moi:

select dateadd(dd,-1,dateadd(mm,datediff(mm,0,YOUR_DATE)+1,0))

En gros, vous obtenez le nombre de mois à compter du début de l'heure (SQL Server) pour YOUR_DATE. Ajoutez-en ensuite un pour obtenir le numéro de séquence du mois prochain. Ensuite, vous ajoutez ce nombre de mois à 0 pour obtenir une date correspondant au premier jour du mois suivant. Ensuite, vous soustrayez un jour pour vous rendre au dernier jour de YOUR_DATE.

0
Peter Perháč

Cette requête peut également être utilisée.

DECLARE @SelectedDate DATE =  GETDATE()

SELECT DATEADD(DAY, - DAY(@SelectedDate), DATEADD(MONTH, 1 , @SelectedDate)) EndOfMonth
0
Serkan Arslan

Prenez une date de base qui est le 31 d'un mois, par exemple. "20011231". Puis utilisez le
procédure suivante (j’ai donné 3 exemples identiques ci-dessous, seule la valeur @dt est différente).

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');
0
peter.petrov

Si vous en avez souvent besoin, enveloppez-le dans un fichier TVF en ligne très rapide:

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/21/calculating-third-wednesday-of-the-month-with-inline-udfs.aspx

0
A-K

Cela fonctionne pour moi avec Microsoft SQL Server 2005:

DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0))
0
Aulia