计算日期

时间:2011-09-29 13:49:29

标签: sql sql-server-2008 date

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

我想自动获得上述结果。请帮忙。

感谢。

5 个答案:

答案 0 :(得分:1)

使用

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

然后更新您的查询以使用

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

通过使用小于运算符,您无需担心时间部分。

答案 1 :(得分: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

答案 2 :(得分: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个月。)

答案 3 :(得分: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'

我觉得有一种更好的方法可以做到这一点......

答案 4 :(得分: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