使用SQL语句达到下面要求:将一个月按要求分为4周
例如: 2009年4月份我要的分周结果如下:4月1号-4月5(星期日) 划为第一周
4月6号-4月12(星期日) 划为第二周
4月13号-4月19(星期日) 划为第三周
4月27号-4月30(星期日) 划为第四周分周条件:
1、以每月第一天为第一周开始日期,以每月第一个星期天为第一周结束日期,如果当月第一天为星期天,则将第二个星期日当作第一周结束日期,
2、第二及第三周为整周
2、划完前三周后,剩余的天数当作第四周, 最后一周结束日期为当月最后一天最后需要得出的结果:
每周的开始与结束日期
第一周开始日期 2009.4.1, 结束日期: 2009.4.5
第一周开始日期 2009.4.6, 结束日期: 2009.4.12
第一周开始日期 2009.4.13, 结束日期: 2009.4.19
第一周开始日期 2009.4.20, 结束日期: 2009.4.30
例如: 2009年4月份我要的分周结果如下:4月1号-4月5(星期日) 划为第一周
4月6号-4月12(星期日) 划为第二周
4月13号-4月19(星期日) 划为第三周
4月27号-4月30(星期日) 划为第四周分周条件:
1、以每月第一天为第一周开始日期,以每月第一个星期天为第一周结束日期,如果当月第一天为星期天,则将第二个星期日当作第一周结束日期,
2、第二及第三周为整周
2、划完前三周后,剩余的天数当作第四周, 最后一周结束日期为当月最后一天最后需要得出的结果:
每周的开始与结束日期
第一周开始日期 2009.4.1, 结束日期: 2009.4.5
第一周开始日期 2009.4.6, 结束日期: 2009.4.12
第一周开始日期 2009.4.13, 结束日期: 2009.4.19
第一周开始日期 2009.4.20, 结束日期: 2009.4.30
表结构:
BaseData:
项目ID 合同金额 合同数量 类型 开始日期 结束日期
P001 100000 10 W 2007-01-01 2007-01-07
P001 200000 20 W 2007-01-08 2007-01-15
P001 150000 15 W 2007-01-16 2007-01-23
P002 50000 25 W 2007-01-01 2007-01-07
P002 30000 30 W 2007-01-08 2007-01-15
P002 70000 40 W 2007-01-16 2007-01-23类型'w'为周报,开始日期和结束日期为报表报告内容的起止日期,比如说我要查2007-01-09的周报,就是2007-01-09所在周的周报比如说我要查2007-01-09的汇总
作一个数据汇总统计如下表:项目ID 合同数量/周 周金额 月累计数量 月累计金额
P001 20 200000 30 300000
P002 30 30000 55 80000请问实现数据汇总统计SQL语句怎么写???表结构:
BaseData:
项目ID 合同金额 合同数量 类型 开始日期 结束日期
P001 100000 10 W 2007-01-01 2007-01-07
P001 200000 20 W 2007-01-08 2007-01-15
P001 150000 15 W 2007-01-16 2007-01-23
P002 50000 25 W 2007-01-01 2007-01-07
P002 30000 30 W 2007-01-08 2007-01-15
P002 70000 40 W 2007-01-16 2007-01-23类型'w'为周报,开始日期和结束日期为报表报告内容的起止日期,比如说我要查2007-01-09的周报,就是2007-01-09所在周的周报比如说我要查2007-01-09的汇总
作一个数据汇总统计如下表:项目ID 合同数量/周 周金额 月累计数量 月累计金额
P001 20 200000 30 300000
P002 30 30000 55 80000请问实现数据汇总统计SQL语句怎么写???表结构:
BaseData:
项目ID 合同金额 合同数量 类型 开始日期 结束日期
P001 100000 10 W 2007-01-01 2007-01-07
P001 200000 20 W 2007-01-08 2007-01-15
P001 150000 15 W 2007-01-16 2007-01-23
P002 50000 25 W 2007-01-01 2007-01-07
P002 30000 30 W 2007-01-08 2007-01-15
P002 70000 40 W 2007-01-16 2007-01-23类型'w'为周报,开始日期和结束日期为报表报告内容的起止日期,比如说我要查2007-01-09的周报,就是2007-01-09所在周的周报比如说我要查2007-01-09的汇总
作一个数据汇总统计如下表:项目ID 合同数量/周 周金额 月累计数量 月累计金额
P001 20 200000 30 300000
P002 30 30000 55 80000请问实现数据汇总统计SQL语句怎么写???-------------create table #temp(项目ID varchar(10), 合同金额 varchar(30), 合同数量 varchar(30), 类型 varchar(30), 开始日期 datetime, 结束日期 datetime)
insert #temp select 'P001','100000','10','w','2007-01-01','2007-01-07'
union all select 'P001','200000','20','w','2007-01-08','2007-01-15'
union all select 'P001','150000','15','w','2007-01-16','2007-01-23'
union all select 'P002','50000','25','w','2007-01-01','2007-01-07'
union all select 'P002','30000','30','w','2007-01-08','2007-01-15'
union all select 'P002','70000','40','w','2007-01-16','2007-01-23'
select * from #temp
where datediff(d,开始日期,'2007-1-9')<=7 and datediff(d,开始日期,'2007-1-9')>0----------------P001 200000 20 w 2007-01-08 2007-01-15
P002 30000 30 w 2007-01-08 2007-01-15
默认情况下,SQL是以星期天作为一周的第一天.
所以,要取得以星期一为一周的第一天,要用:
datepart(weekday,getdate())-1select 数字星期=datepart(weekday,getdate())-1
,文字星期=datename(weekday,getdate())
,第几周=datepart(week,getdate()) select dateadd(day,iid-1,'1949-01-01') as 日期,
year(dateadd(day,iid-1,'1949-01-01')) as 年份,
month(dateadd(day,iid-1,'1949-01-01')) as 月份,
day(dateadd(day,iid-1,'1949-01-01')) as 日期,
datepart(quarter,(dateadd(day,iid-1,'1949-01-01'))) as 季度,
datepart(weekday,(dateadd(day,iid-1,'1949-01-01'))) as 星期,
day(dateadd(day,iid-1,'1949-01-01')) as 月的第几表,
datepart(week,(dateadd(day,iid-1,'1949-01-01'))) as 年的第几周
from #tmp
datediff是计算两个时间间的差,如差几天或是几个月,或是几年等
select datediff(day,'2008.9.2','2008.10.28') dateadd则是算出在已知时间的基础上再加多少天是几月几日.
select dateadd(year,10,getdate())
select dateadd(month,10,getdate())
select dateadd(day,10,getdate())
set @Date='2009-4-05'Declare @Date1_1 datetime 第1周开始日期
Declare @Date1_2 datetime 第1周结束日期
Declare @Date2_1 datetime 第2周开始日期
Declare @Date2_2 datetime 第2周结束日期
Declare @Date3_1 datetime 第3周开始日期
Declare @Date3_2 datetime 第3周结束日期
Declare @Date4_1 datetime 第4周开始日期
Declare @Date4_2 datetime 第4周结束日期declare @Year varchar(4)
declare @Month varchar(2)
set @Year=datepart(yy,@Date)
set @Month=datepart(mm,@Date)set @Date1_1=cast(@Year+'-'+@Month+'-01' as datetime)
set @Date4_2=cast(dateadd(dd,-1,cast(@Year+'-'+datename(mm,dateadd(mm,1,@Date))+'-01' as datetime)) as datetime)set datefirst 1
select @Date1_1
select @Date1_2=case when datepart(dw,@Date1_1)=7 then dateadd(dd,7,@Date1_1) else dateadd(dd,7-datepart(dw,@Date1_1),@Date1_1) end
select @Date1_2
select @Date2_1=dateadd(dd,1,@Date1_2)
select @Date2_1
select @Date2_2=dateadd(dd,6,@Date2_1)
select @Date2_2
select @Date3_1=dateadd(dd,1,@Date2_2)
select @Date3_1
select @Date3_2=dateadd(dd,6,@Date3_1)
select @Date3_2
select @Date4_1=dateadd(dd,1,@Date3_2)
select @Date4_1
select @Date4_2
declare @bgeindate varchar(50)
set @date='2009-04'
begin
set @bgeindate=@date+'-01'select @bgeindate+','+convert(varchar(10), dateadd(d,7-datepart(weekday,@bgeindate)+1,@bgeindate),120)
union all
select convert(varchar(10), dateadd(d,7-datepart(weekday,@bgeindate)+1+1,@bgeindate),120)
+','+convert(varchar(10), dateadd(d,14-datepart(weekday,@bgeindate)+1,@bgeindate),120)
union all
select convert(varchar(10), dateadd(d,14-datepart(weekday,@bgeindate)+1+1,@bgeindate),120)+','
+convert(varchar(10), dateadd(d,21-datepart(weekday,@bgeindate)+1,@bgeindate),120)
union all
select convert(varchar(10), dateadd(d,21-datepart(weekday,@bgeindate)+1+1,@bgeindate),120)+','
+convert(varchar(10),dateadd(d,-1,dateadd(mm,1, @bgeindate)),120)
end/*
-------------------------------------------------------------
2009-04-01,2009-04-05
2009-04-06,2009-04-12
2009-04-13,2009-04-19
2009-04-20,2009-04-30(所影响的行数为 4 行)
*/
declare @beginDate datetime
set @beginDate = '2009-4-1'
declare @endDate datetime
set @endDate = dateadd(month,1,@beginDate)-1
declare @curDate datetimeset @curDate = @beginDatedeclare @w int
set @w = 1
while @w <=3
begindeclare @i int
set @i = datepart(w,@curDate)if @i = 7
set @i=0while @i<7
begin
set @curDate = dateadd(day,1,@curDate)
set @i = @i+1
end
print '第' + convert(varchar(5),@w) + '周开始日期:' + convert(varchar(10), @beginDate,120) + ' ' + convert(varchar(10), @curDate,120)
set @beginDate = dateadd(day,1,@curDate)
set @w = @w +1
endprint '第' + convert(varchar(5),@w) + '周开始日期:' + convert(varchar(10),@beginDate,120) + ' ' + convert(varchar(10),@endDate,120)
第1周开始日期:2009-04-01 2009-04-05
第2周开始日期:2009-04-06 2009-04-12
第3周开始日期:2009-04-13 2009-04-19
第4周开始日期:2009-04-20 2009-04-30
@BeginDate smalldatetime,
@EndDate smalldatetime
ASIF @BeginDate>@EndDate---日期不对刚返回
RETURNCREATE table #WeekDate
(Weekth int,
dBeginDate smalldatetime ,
dEndDate smalldatetime null)DECLARE @Weekth int
SET @Weekth=1INSERT INTO #WeekDate
SELECT 1,@BeginDate,NULLIF DATEPART(weekday,@BeginDate)=7---星期六为第一周只有一天
UPDATE #WeekDate SET dEndDate= @BeginDate WHILE @Weekth=1WHILE @BeginDate<@Enddate
BEGIN
SET @BeginDate=DATEADD(dd,1,@BeginDate)
IF DATEPART(weekday,@BeginDate)=1---星期天一周开始
BEGIN
SET @Weekth=@Weekth+1
INSERT INTO #WeekDate
SELECT @Weekth,@BeginDate,NULL
END
IF DATEPART(weekday,@BeginDate)=7 --星期六
UPDATE #WeekDate SET dEndDate= @BeginDate WHERE Weekth=@Weekth
END
UPDATE #WeekDate SET dEndDate= @EndDate WHERE Weekth=@Weekth---最后一天为当月最后一周结束日期
SELECT * FROM #WeekDate
--EXECUTE ShowWeekDate '2009-04-01','2010-04-30'
Begin
declare @inputdate datetime,@nextmonth datetime,@i int
declare @result table(sno int,bdate datetime,edate datetime)
set @inputdate = convert(datetime,right('0000'+@year,4)+right('00'+@week,2)+'01',112)
set @nextmonth = DATEADD(month, 1, @inputdate)
set @i=1insert into @result(sno,bdate)
values(@i,@inputdate)
set @inputdate=@inputdate+1while (@inputdate<@nextmonth)
begin
if(DATENAME(WEEKDAY,@inputdate)='星期日')
begin
update @result set edate=@inputdate where sno=@i
set @i = @i+1
end
else if(DATENAME(WEEKDAY,@inputdate)='星期一' and @i<=4)
begin
insert into @result(sno,bdate)
values(@i,@inputdate)
end
set @inputdate=@inputdate+1
end
update @result set edate=@inputdate-1 where sno=4
select * from @result
end自己写的,实现的数据以表格存放,可重利用,至于输出效果的美化我就不用麻烦了吧。