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 行受影响) */
-- 建函数 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
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 行受影响)
*/
这个是数据表格式 ,不知道合理不 麻烦版主给看一下。
要求是 根据一个起始日期 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 --结束时间-分 )谢了。
/*
工作时间:星期一,星期二,星期三,星期四,星期五 ,星期六半天
星期一(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 ????麻烦了 版主 谢谢
-- 建函数
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)
*/
select dbo.fn_getP_EndTime(5,'2014-03-11 08:00:00')
结果
-----------------------
2014-03-11 13:00:00.000
应该是14点才对
应该把between改为>上班时间and<=下班时间
----------- ---------------------------- ---------------------------- ---------------------------- ----------------------------
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)