现在需要写个汇总的语句,where条件不知道怎么写了?打个比方说:如果当天日期在本月的最后2天内,则开始日期为本月的倒数第3天,结束日期为下个月的倒数第4天。
如果当天日期下个月的话,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。举例说明:
t1:
date num
2010-07-28 10
2010-07-29 20
2010-07-30 30
2010-07-31 40
2010-08-01 50比如说:拿7月份为例,当天日期为本月的最后2天(30号或31号)的话,则汇总语句的where条件开始日期为本月的倒数第3天即:2010-07-29,结束日期为下个月的倒数第4天,即:2010-08-28。(这是第1种情况)
过了31号,到了8月份的话,例如当天日期为2010-08-01,则开始日期为上个月的倒数第3天即:2010-07-29,结束日期为本月倒数第4天即:2010-08-28。(第2种情况)其实,就是针对当天日期(getdate())判断是否为本月的最后2天,如果是,则开始日期为本月的倒数第3天,结束日期为下个月的倒数第4天, 如果(getdate())不是本月最后2天,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。请指教!!!谢谢!
如果当天日期下个月的话,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。举例说明:
t1:
date num
2010-07-28 10
2010-07-29 20
2010-07-30 30
2010-07-31 40
2010-08-01 50比如说:拿7月份为例,当天日期为本月的最后2天(30号或31号)的话,则汇总语句的where条件开始日期为本月的倒数第3天即:2010-07-29,结束日期为下个月的倒数第4天,即:2010-08-28。(这是第1种情况)
过了31号,到了8月份的话,例如当天日期为2010-08-01,则开始日期为上个月的倒数第3天即:2010-07-29,结束日期为本月倒数第4天即:2010-08-28。(第2种情况)其实,就是针对当天日期(getdate())判断是否为本月的最后2天,如果是,则开始日期为本月的倒数第3天,结束日期为下个月的倒数第4天, 如果(getdate())不是本月最后2天,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。请指教!!!谢谢!
select @t = GETDATE() select datediff(dd,@t,dateadd(mm,1,@t))
Declare @Date Datetime
Set @Date=GetDate()
SELECT @Date AS [原始日期]
,DATEADD(DAY,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS [开始日期]
,DATEADD(Second,-1,DATEADD(DAY,-2,DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))) AS [结束日期]
drop table t1
go
create table t1([date] datetime,[num] int)
go
insert into t1
select '2010-07-28', 10
union all select '2010-07-29', 20
union all select '2010-07-30', 30
union all select '2010-07-31', 40
union all select '2010-08-01', 50
Declare @Date Datetime
Set @Date=getdate()select [Sum] = sum(num) from t1 where [date] between (select [Before] = (case
--当前日期不是本月的最后两天,开始日期为上个月的倒数第三天
when datediff(mm,@Date,dateadd(dd,2,@Date))=0
then dateadd(dd,-3,convert(varchar(8),@Date,120) + '01 ')
--开始日期为本月的倒数第三天
else dateadd(dd,-3,convert(varchar(8),dateadd(mm,1,@Date),120) + '01 ')
end)) and ( select [End] = (case
--当前日期不是本月的最后两天,结束日期为本月倒数第四天
when datediff(mm,@Date,dateadd(dd,2,@Date))=0
then dateadd(dd,-4,convert(varchar(8),dateadd(mm,1,@Date),120) + '01 ')
--结束日期为下个月倒数第四天
else dateadd(dd,-4,convert(varchar(8),dateadd(mm,2,@Date),120) + '01 ')
end))
/*
Sum
-----------
140(1 行受影响)
*/
declare @ldt_last datetime --当前月的前一个月的最后一天
declare @ldt_next datetime --当前月的后一个月的最后一天
select @ldt_end=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate())+1)+'-01',120))
select @ldt_last=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate()))+'-01',120))
select @ldt_next=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate())+2)+'-01',120))select case when datediff(day,getdate(),@ldt_end)>2 then
dateadd(dy,-3,@ldt_last)
else
dateadd(dy,-3,@ldt_end)
end ,
case when datediff(day,getdate(),@ldt_end)>2 then
dateadd(dy,-4,@ldt_end)
else
dateadd(dy,-4,@ldt_next)
end