本帖最后由 ggt87125 于 2014-03-09 22:22:58 编辑

解决方案 »

  1.   

    declare @i int ,@j int ,@k datetime,@o int
    set @i=0 
    set @o=0
    set @j=33
    set @k='2014-03-07 13:00'
      if(@i=0)
      begin 
      select @j=@j- case when Datepart(hh,'2014-03-07 13:00')>=9 and Datepart(hh,'2014-03-07 13:00')<=12 then 12-Datepart(hh,'2014-03-07 13:00')+4
                   when Datepart(hh,'2014-03-07 13:00')>=13 and Datepart(hh,'2014-03-07 13:00')<=17 then 17-Datepart(hh,'2014-03-07 13:00')
                   else 7 end 
      end 
    while(@j>=0)
    begin
    select @j=@j- case when  Datepart(weekday,dateadd(dd,1,@k)) in(2,3,4,5,6) then 7 else 3 end 
    set @k =dateadd(dd,1,@k)
    end 
    select case when 7+@j <=3 then dateadd(hh,9+(7+@j), dateadd(dd,-1,dateadd(hh,-Datepart(hh,@k),@k)))
           else dateadd(hh,13+(4+@j), dateadd(dd,-1,dateadd(hh,-Datepart(hh,@k),@k))) end as '结束日期'/*
    结束日期
    -----------------------
    2014-03-12 11:00:00.000(1 行受影响)
    */
      

  2.   

    请给出具体的表结构和测试数据,才好帮你写SQL喔.
      

  3.   


    这个是数据表格式 ,不知道合理不  麻烦版主给看一下。
    要求是  根据一个起始日期 2014-03-07 13:00 开始 ,
    工作时间需要 35个小时 ,那么到时间时间能结束?

    /*
    工作时间:星期一,星期二,星期三,星期四,星期五 ,星期六半天
      星期一(08:00-12:00,13:00-17:30)
      星期二(08:00-12:00,13:00-17:30)
      星期三(08:00-12:00,13:00-17:30)
      星期四(08:00-12:00,13:00-17:30)
      星期五(08:00-12:00,13:00-17:30)
      星期六(08:00-11:00 )
    */ 
     create table TWTWorkOfPeriodTime  (
      [ID]  int,  --自动编号 
      [FName]  varchar(50),  --日期名称
      [IsWork] bit,  --是否工作(1:是工作)
      [WorkKind] int,  --工作类型:工作日?请假/休假/加班/年假
      [A_StartHour] int,  --开始时间-时
      [A_StartMinute] int,  --开始时间-分
      [A_EndHour] int,  --结束时间-时
      [A_EndMinute] int  --结束时间-分
    ,
      [P_StartHour] int,  --开始时间-时
      [P_StartMinute] int,  --开始时间-分
      [P_EndHour] int,  --结束时间-时
      [P_EndMinute] int  --结束时间-分  )谢了。
      

  4.   

    请给出具体的表结构和测试数据,才好帮你写SQL喔.
      

  5.   


    /*
     工作时间:星期一,星期二,星期三,星期四,星期五 ,星期六半天
       星期一(08:00-12:00,13:00-17:30)
       星期二(08:00-12:00,13:00-17:30)
       星期三(08:00-12:00,13:00-17:30)
       星期四(08:00-12:00,13:00-17:30)
       星期五(08:00-12:00,13:00-17:30)
       星期六(08:00-11:00 )
     */ 
      create table TWork_PeriodTime  (
       [ID]  int,  --自动编号 
       [FName]  varchar(50),  --日期名称
       [IsWork] bit,  --是否工作(1:是工作)
       [WorkKind] int,  --工作类型:工作日?请假/休假/加班/年假   [A_StartHour] int,  --开始时间-时
       [A_StartMinute] int,  --开始时间-分
       [A_EndHour] int,  --结束时间-时
       [A_EndMinute] int  --结束时间-分
     ,
       [P_StartHour] int,  --开始时间-时
       [P_StartMinute] int,  --开始时间-分
       [P_EndHour] int,  --结束时间-时
       [P_EndMinute] int  --结束时间-分   )
        --delete from TWork_PeriodTime
    insert into TWork_PeriodTime
    select 0,'星期一',0,1, 8 ,0 ,12,0 , 13,0,17,30
    insert into TWork_PeriodTime
    select 1,'星期二',0,1, 8 ,0 ,12,0 , 13,0,17,30 insert into TWork_PeriodTime
    select 2,'星期三',0,1, 8 ,0 ,12,0 , 13,0,17,30 insert into TWork_PeriodTime
    select 3,'星期四',0,1, 8 ,0 ,12,0 , 13,0,17,30 insert into TWork_PeriodTime
    select 4,'星期五',0,1, 8 ,0 ,12,0 , 13,0,17,30 insert into TWork_PeriodTime
    select 5,'星期六',0,1, 8 ,0 ,11,30 , 0,0,0,0
     
        
       create table TWork_Profile (
       [ID]  int,  --自动编号 
       [FName]  varchar(50),  --任务名称 
       [WorkHours] int,  --任务需要时间 (单位小时)
       [A_StarTime] datetime,  --开始时间-时 
       [P_EndTime] datetime   --??????  计算截止日期 
       )   insert into TWork_Profile
       select 0 ,'任务一',66 ,'2013-03-07 09:15',null   insert into TWork_Profile
       select 0 ,'任务二',26 ,'2013-03-09 12:00',null     insert into TWork_Profile
       select 0 ,'任务三',16 ,'2013-03-11 13:00',null   select * from TWork_PeriodTime
       select * from TWork_Profile  -- 计算 P_EndTime  ????麻烦了 版主  谢谢
      

  6.   


    -- 建函数
    create function dbo.fn_getP_EndTime
    (@wh int,@start datetime) returns datetime
    as
    begin
     declare @i int,@end datetime
     select @i=1,@end=@start
     
     while(@i<=@wh)
     begin
      select @end=dateadd(hh,1,@end)
      
      if exists(select 1 from
                (select case FName 
                        when '星期一' then 2
                        when '星期二' then 3
                        when '星期三' then 4
                        when '星期四' then 5
                        when '星期五' then 6
                        when '星期六' then 7 end 'f',
                        rtrim(A_StartHour)+':'+rtrim(A_StartMinute)+':00' 'm1',
                        rtrim(A_EndHour)+':'+rtrim(A_EndMinute)+':00' 'm2',
                        rtrim(P_StartHour)+':'+rtrim(P_StartMinute)+':00' 'a1',
                        rtrim(P_EndHour)+':'+rtrim(P_EndMinute)+':00' 'a2'
                 from TWork_PeriodTime) t
                 where f=datepart(dw,@end) 
                 and (@end between cast(convert(varchar,@end,111)+' '+m1 as datetime)
                           and cast(convert(varchar,@end,111)+' '+m2 as datetime)
                      or
                      @end between cast(convert(varchar,@end,111)+' '+a1 as datetime)
                           and cast(convert(varchar,@end,111)+' '+a2 as datetime)))
      begin
        select @i=@i+1
      end
     end
     
     return @end
    end
    -- 更新
    update TWork_Profile 
     set P_EndTime=dbo.fn_getP_EndTime(WorkHours,A_StarTime)
    -- 结果
    select * from TWork_Profile/*
    ID          FName                WorkHours   A_StarTime              P_EndTime
    ----------- -------------------- ----------- ----------------------- -----------------------
    0           任务一                  66          2013-03-07 09:15:00.000 2013-03-16 08:15:00.000
    0           任务二                  26          2013-03-09 12:00:00.000 2013-03-13 13:00:00.000
    0           任务三                  16          2013-03-11 13:00:00.000 2013-03-13 09:00:00.000(3 row(s) affected)
    */
      

  7.   

    版主的这个函数有点问题,判断整点时间时就会不对,
     select dbo.fn_getP_EndTime(5,'2014-03-11 08:00:00')
    结果
    -----------------------
    2014-03-11 13:00:00.000
    应该是14点才对
    应该把between改为>上班时间and<=下班时间
      

  8.   

    建议修改TWork_PeriodTime表结构为如下,这样就不必每次调用函数都需要重新计算一次.f           m1                           m2                           a1                           a2
    ----------- ---------------------------- ---------------------------- ---------------------------- ----------------------------
    2           8:0:00                       12:0:00                      13:0:00                      17:30:00
    3           8:0:00                       12:0:00                      13:0:00                      17:30:00
    4           8:0:00                       12:0:00                      13:0:00                      17:30:00
    5           8:0:00                       12:0:00                      13:0:00                      17:30:00
    6           8:0:00                       12:0:00                      13:0:00                      17:30:00
    7           8:0:00                       11:30:00                     0:0:00                       0:0:00(6 row(s) affected)