计算日期

问题描述:

我有一个月度报告,目前我手动运行。因此,报告从上个月的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

使用

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

然后更新您的查询中使用

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

通过使用比运营商少,你就不必担心时间部分。

这应该工作:上个月的

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 

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日)。

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' 

我有一种感觉,有一种更好的方式,虽然这样做......

这样创建日期:

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