create function getMinutes(@start varchar(20),@end varchar(20))
returns varchar(10)
as
begin
declare @dd varchar(10)
set @dd=datediff(n,@start,@end)
return @dd
end
select dbo.getMinutes('2012-10-10 20:10:10','2013-11-20 00:00:10')
alter FUNCTION [dbo].[fn_WorkHour](
@dt_begin datetime, --计算的开始日期
@dt_end datetime --计算的结束日期
)RETURNS int
AS
BEGIN
if (@dt_begin>@dt_end)
RETURN 0
DECLARE @workhour int,@beginday int ,@endday int
SET @beginday=0
SET @endday=0
set @workhour=0
WHILE day(@dt_begin)<day(@dt_end)
BEGIN
--如果是非工作日则跳过
if(DateName(WEEKDAY ,@dt_begin)='星期六' or DateName(WEEKDAY ,@dt_begin)='星期日')
begin
set @dt_begin=dateadd(dd,1,@dt_begin)
CONTINUE
end
--如果明天的开始日期等于结束日期,且大于明天16:00,那么就直接设初始值为明早上9:00
if (day(dateadd(dd,1,@dt_begin))= day(@dt_end) and dateadd(dd,1,@dt_begin)>=convert(datetime,convert(varchar(10),@dt_end,120)+' 16:00'))
set @dt_begin=convert(datetime,convert(varchar(10),dateadd(dd,1,@dt_begin),120)+' 9:00')
else
begin
set @dt_begin=dateadd(dd,1,@dt_begin)
set @workhour=@workhour+330
end
END
DECLARE @date9 datetime
DECLARE @date12 datetime
DECLARE @date13 datetime
DECLARE @date16 datetime
set @date9=convert(datetime,convert(varchar(10),@dt_begin,120)+' 9:00')
set @date12=convert(datetime,convert(varchar(10),@dt_begin,120)+' 12:00')
set @date13=convert(datetime,convert(varchar(10),@dt_begin,120)+' 13:30')
set @date16=convert(datetime,convert(varchar(10),@dt_begin,120)+' 16:00')
--如果开始时间是在早上九点以前或者是在晚上16点以后,则不计算。
if (@dt_begin<@date9 or @dt_begin>@date16)
set @beginday=0
else
begin
--如果时间是在上午
if (@dt_begin<=@date12)
set @beginday=DATEDIFF(Minute ,@date9,@dt_begin)
--如果时间是在中午
if (@dt_begin>@date12 and @dt_begin<@date13)
set @beginday=180
--如果时间是在下午
if (@dt_begin>=@date13)
set @beginday=330-DATEDIFF(Minute ,@dt_begin,@date16)
end
--如果开始时间是在早上九点以前或者是在晚上16点以后,则不计算。
if (@dt_end<@date9 or @dt_end>@date16)
set @endday=0
else
begin
--如果时间是在上午
if (@dt_end<=@date12)
set @endday=DATEDIFF(Minute ,@date9,@dt_end)
--如果时间是在中午
if (@dt_end>@date12 and @dt_end<@date13)
set @endday=180
--如果时间是在下午
if (@dt_end>=@date13)
set @endday=330-DATEDIFF(Minute ,@dt_end,@date16)
end
RETURN @workhour-@beginday+@endday
end
--测试
--select dbo.fn_WorkHour('2013-3-15 9:00','2013-3-18 10:00') --390
--select dbo.fn_WorkHour('2013-3-15 9:00','2013-3-15 10:00') --60
--select dbo.fn_WorkHour('2013-3-14 19:00','2013-3-15 10:00') --60