计算日期
问题描述:
我有一个月度报告,目前我手动运行。因此,报告从上个月的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'
我想自动获得上述结果。请帮忙。
谢谢。
答
使用
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
您使用的是什么RDBMS? MySQL,Sql Server等? – cdeszaq
另外,如果你接受的答案你们有些人问的问题,你可能会得到未来的问题,更好的反应。 59: – cdeszaq
SQL Server 2008中 – faiz