2011-09-29 206 views
0

我有一個月度報告,目前我手動運行。因此,報告從上個月的27日延伸到26日的當前月份。計算日期

比如我正在使用下面的手動:

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

下個月它去是:

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

我想自動獲得上述結果。請幫忙。

謝謝。

+1

您使用的是什麼RDBMS? MySQL,Sql Server等? – cdeszaq

+7

另外,如果你接受的答案你們有些人問的問題,你可能會得到未來的問題,更好的反應。 59: – cdeszaq

+0

SQL Server 2008中 – faiz

回答

1

使用

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

然後更新您的查詢中使用

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

通過使用比運營商少,你就不必擔心時間部分。

0

這應該工作:上個月的

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日:

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

本月26日:

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

而不是試圖時間部分設置爲最後在26日的可能時刻,使用小於<的比較將好得多,而不是<=between。然後,你只需要在本月27日:

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

如果你想要的東西基於特定「基準日」(而不是「本月」),然後替換爲我使用CURRENT_TIMESTAMP該日期值。您始終保留日期文字(例如'20110101')。


以上所有計算都以相同的方式工作 - 內部DATEDIFF計算自任意日期以來發生的月份轉換次數;然後我們將相同數量的月份轉換添加到第二個日期 - 不完全是任意的 - 表現出我們想要實現的最終「偏移」(例如,在第一個日期中,「任意日期」是2011年2月1日。第二個日期日期是2011年1月27日 - 前一個月的27日)。

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' 

我有一種感覺,有一種更好的方式,雖然這樣做......

0

這樣創建日期:

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) 

,然後用它們像這樣:

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