2011-09-29 6 views
0

J'ai un rapport mensuel que je cours manuellement actuellement. Donc, le rapport va du mois précédent du 27 au mois actuel du 26.Calcul des dates

Par exemple, je suis manuellement à l'aide de ce qui suit:

declare @StartDate datetime = '08/27/2011 00:00:00' 
declare @EndDate datetime = '09/26/2011 23:59:59' 

pour le mois prochain ça va être:

declare @StartDate datetime = '09/27/2011 00:00:00' 
declare @EndDate datetime = '10/26/2011 23:59:59' 

Je voulais obtenir automatiquement les résultats ci-dessus. S'il vous plaît aider.

Merci.

+1

Quel RDBMS utilisez-vous? MySQL, Sql Server, etc? – cdeszaq

+7

En outre, si vous acceptez les réponses à certaines des questions que vous avez posées, vous obtiendrez peut-être une meilleure réponse aux questions à venir. – cdeszaq

+0

Sql Server 2008 – faiz

Répondre

1

Utilisez

declare @EndDate datetime = DATEADD(month,1,@StartDate) 

Ensuite, mettez à jour votre requête à utiliser

where [TheDate] >= @StartDate and [TheDate] < @EndDate 

En utilisant un opérateur moins, vous ne serez pas à vous soucier de la partie du temps.

0

Cela devrait fonctionner:

declare @DayOfMonth tinyint set @DayOfMonth = 27 
declare @Month tinyint set @Month = DATEPART(month, getDate()) 
declare @Year int set @Year = DATEPART(year, getDate()) 

declare @calcDate datetime 
declare @startDate datetime 
declare @endDate datetime 

select @calcDate = 
    DATEADD(day, @DayOfMonth - 1, 
     DATEADD(month, @Month - 1, 
      DATEADD(Year, @Year-1900, 0))) 
select @startDate = DATEADD(month, -1, @calcDate) 
select @endDate = DATEADD(SECOND, -1, @calcDate) 

select @startDate 
select @endDate 
0

27 du mois dernier:

DATEADD(month,DATEDIFF(month,'20110201',CURRENT_TIMESTAMP),'20110127') 

26 ce mois-ci:

DATEADD(month,DATEDIFF(month,'20110101',CURRENT_TIMESTAMP),'20110126') 

Plutôt que d'essayer de définir la partie de temps à la dernière moment possible le 26, il serait préférable d'utiliser une comparaison moins que <, plutôt que <= ou between. Ensuite, vous avez juste besoin le 27 de ce mois:

DATEADD(month,DATEDIFF(month,'20110101',CURRENT_TIMESTAMP),'20110127') 

Si vous voulez quelque chose basé sur une « date de base » particulière (plutôt que « ce mois »), puis remplacer cette valeur date à laquelle j'utilise CURRENT_TIMESTAMP . Vous laissez toujours les littéraux de date (par exemple, '20110101') tels qu'ils sont.


Tous les calculs ci-dessus fonctionnent de la même manière - le DATEDIFF interne calcule le nombre de transitions de mois qui se sont produits depuis une date arbitraire; nous ajoutons ensuite ce même nombre de transitions mensuelles à une seconde date - pas tout à fait aussi arbitraire - qui présente le «décalage» final que nous voulons atteindre (par exemple, dans la première, la «date arbitraire» est le 1er février 2011). la date est le 27 janvier 2011 - le 27 du mois précédent).

0
Declare @ReportStartDay int = 27; 

declare @CurrentDay int; 
declare @dateDiff int = 0; 
set @CurrentDay = DAY(DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))) 
set @dateDiff = (@CurrentDay - @ReportStartDay) *-1; 

Declare @ReportStartDate datetime = DATEADD(mm, -1, DATEADD(dd, @datediff, DATEDIFF(dd, 0, GETDATE()))) 
Declare @ReportEndDate datetime = DATEADD(dd, @dateDiff - 1, DATEDIFF(dd, 0, GETDATE())) 

select @ReportStartDate as 'Start Date', @ReportEndDate as 'End Date' 

J'ai le sentiment qu'il ya une meilleure façon de le faire si ...

0

Créer les dates comme ceci:

declare @StartDate datetime 
declare @EndDate datetime 
set @EndDate = convert(datetime, cast(year(getdate()) as varchar) + '/' + cast(month(getdate()) as varchar) + '/' + '27', 101) 
set @StartDate = dateadd(m, -1, @EndDate) 

Et puis les utiliser comme ceci:

select .... 
from ... 
where MyDate >= @StartDate and MyDate < @EndDate