2008-10-08 5 views
6

Plus précisément MSSQL 2005.Comment calculer le dernier jour du mois en SQL?

+0

Je ne suis pas sûr que la réponse que vous avez marqué comme accepté fonctionne acutally . Exécutez '2009 Jan 30' à travers et voir ce que ça donne? – MatBailie

+0

Bonjour? Le travail de la réponse acceptée ... – MatBailie

+0

Dems, j'utilisé cette source d'inspiration pour la solution que je mis en œuvre, mais qui est presque il y a un an, donc je ne me souviens pas exactement ce que je faisais ... –

Répondre

17

est ici une solution qui vous donne la dernière seconde du mois en cours. Vous pouvez extraire la partie date ou la modifier pour revenir juste le jour. Je l'ai testé cela sur SQL Server 2005.

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

Pour comprendre comment cela fonctionne, nous devons examiner les fonctions dateadd() et datediff().

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

Si vous exécutez simplement l'appel le plus intérieur à datediff(), vous obtenez le nombre de mois en cours depuis l'horodatage 0.

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

La partie suivante ajoute que nombre de mois plus 1 à 0 Horodatage, vous indiquant le point de départ du mois calendaire suivant.

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

Enfin, le dateadd extérieur() soustrait juste une seconde de l'horodatage début du mois prochain, vous donnant la dernière seconde du mois en cours.

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


Cette ancienne réponse (ci-dessous) a un bug où il ne fonctionne pas le dernier jour d'un mois qui a plus de jours que le mois suivant. Je le laisse ici comme un avertissement aux autres.

Ajoutez un mois à la date actuelle, puis soustrayez la valeur renvoyée par la fonction DAY appliquée à la date actuelle à l'aide des fonctions DAY et DATEADD.

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

Que faire si les deux appels getdate donnent des réponses à des dates différentes? –

+0

Je suppose que c'est possible. Vous devez déclarer une variable pour tenir la date d'aujourd'hui au préalable. –

+0

Ils ne le feront pas. Nous créons des rapports qui génèrent des colonnes year, quarter, month et rundate (GetDate()) qui prennent 30 secondes et la valeur ne change jamais. – JeffO

3

Essayez ceci:

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

J'ai souvent constaté que les gens ne suivaient pas la logique de ceci. Donc, même si cela semble correct (où la réponse acceptée semble être incorrecte), je ne vais pas donner +1. Avez-vous une chance de modifier la réponse pour donner l'explication? – 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) 

Parfois, vous avez vraiment besoin le dernier jour de ce mois-ci, mais souvent ce que vous voulez vraiment est de décrire l'intervalle de temps de ce mois-ci. Ceci est la meilleure façon de décrire l'intervalle de temps de ce mois-ci:

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') 

Explication:

Approche générale: utiliser la fonctionnalité temporelle.

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

Ce sont littéraux DATETIME, le premier granule de temps le premier jour et le dernier jour, respectivement du même mois de 31 jours. Le mois choisi est entièrement arbitraire.

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

C'est la différence en mois entiers entre le premier jour du mois de référence et l'horodatage actuel. Appelons cela @calc.

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

Cela ajoute des granules @calc mois au dernier jour du mois de référence, dont le résultat est l'horodatage actuel « arrondi » au dernier jour de son mois. Q.E. D.

+0

+1 pour inclus une explication :) – MatBailie

0

Pour être complet, Oracle vous feriez quelque chose comme ...

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

ou

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

Ils sont les principaux points si vous pouvez obtenir du courant premier jour mois, dernier jour du dernier mois et dernier jour du mois en cours.

Ci-dessous est l'étape par étape pour écrire requête:

Date SQL Server démarre à partir 1901/01/01 (date 0) et jusqu'à présent chaque mois peut être identifié par un numéro. Le mois 12 est le premier mois de 1902 signifie janvier. Le mois 1200 est janvier 2001. De même, chaque jour peut être assigné par un numéro unique, par exemple la date 0 est 1901/01/01. Date 31 est 01.02.1901 en Janvier 1901 commence à 0.

Pour en savoir premier jour du mois courant (date du jour ou une date donnée)

  1. D'abord, nous devons vérifier combien de mois Je suis passé depuis la date 0 (1901/01/01). SELECT DATEDIFF (MM, 0, GETDATE())
  2. Ajouter même nombre de mois à ce jour 0 (1901/01/01)

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

Ensuite, nous allons arriver le premier jour du mois en cours (date du jour ou une date donnée)

pour obtenir la dernière journée du mois dernier

Nous devons soustraire une seconde de la première journée du mois en cours

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

pour obtenir la dernière journée du mois courant

Pour premier jour du mois en cours d'abord, nous avons vérifié combien de mois ont été écoulés depuis la date 0 (1901/01/01).Si nous ajoutons un autre mois avec le nombre total de mois depuis la date 0, puis ajoutons le nombre total de mois avec la date 0, nous obtiendrons le premier jour du mois suivant. Si nous obtenons le premier jour du mois suivant, alors pour obtenir le dernier jour du mois en cours, tout ce dont nous avons besoin pour soustraire une seconde.

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

espoir qui aiderait.

1

En utilisant SQL2005, vous n'avez pas accès à une fonction utile EOMONTH(), vous devez calculer vous-même.

Cette volonté simple fonction fonctionne comme 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 

Requête pour effectuer:

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