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?
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)
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)
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)))
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 !!!!
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.
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)))
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
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
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()))
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()))
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 ()).
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)
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())
Mes 2 centimes:
select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12')))
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.
Cette requête peut également être utilisée.
DECLARE @SelectedDate DATE = GETDATE()
SELECT DATEADD(DAY, - DAY(@SelectedDate), DATEADD(MONTH, 1 , @SelectedDate)) EndOfMonth
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');
Si vous en avez souvent besoin, enveloppez-le dans un fichier TVF en ligne très rapide:
Cela fonctionne pour moi avec Microsoft SQL Server 2005:
DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0))