使用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

解决方案 »

  1.   


    表结构:
    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
      

  2.   


     默认情况下,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())
      

  3.   

    Declare @Date datetime
    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
      

  4.   

    declare @date varchar(50)
    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 行)
    */
      

  5.   

    SET DATEFIRST 1
    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
      

  6.   

    呵呵,高手很多啊,学习了.参考一下我的.输入开始和结束日期则可,如果要多月的,改一下就行了.CREATE PROC ShowWeekDate
    @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'
      

  7.   

    create Procedure get4week(@year varchar(4),@week varchar(2)) As
    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自己写的,实现的数据以表格存放,可重利用,至于输出效果的美化我就不用麻烦了吧。