我有一份月度报告,我目前手动运行。因此,该报告从上个月的第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'
我想自动获得上述结果。请帮忙。
感谢。
答案 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