if exists (select * from dbo.sysobjects where id = object_id(N'[tb_worktime]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [tb_worktime]
GO--定义工作时间表
CREATE TABLE tb_worktime(
ID       int identity(1,1) PRIMARY KEY,            --序号
time_start smalldatetime,                            --工作的开始时间
time_end  smalldatetime,                           --工作的结束时间
worktime  AS DATEDIFF(Minute,time_start,time_end)  --工作时数(分钟)
)
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkTime]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_WorkTime]
GO--计算两个日期之间的工作时间
CREATE FUNCTION f_WorkTime(
@date_begin datetime,  --计算的开始时间
@date_end datetime     --计算的结束时间
)RETURNS int
AS
BEGIN
DECLARE @worktime int
IF DATEDIFF(Day,@date_begin,@date_end)=0
SELECT @worktime=SUM(DATEDIFF(Minute,
CASE WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
THEN CONVERT(VARCHAR,@date_begin,108)
ELSE time_start END,
CASE WHEN CONVERT(VARCHAR,@date_end,108)<time_end
THEN CONVERT(VARCHAR,@date_end,108)
ELSE time_end END))
FROM tb_worktime 
WHERE time_end>CONVERT(VARCHAR,@date_begin,108)
AND time_start<CONVERT(VARCHAR,@date_end,108)
ELSE
SET @worktime
=(SELECT SUM(CASE
WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
THEN DATEDIFF(Minute,CONVERT(VARCHAR,@date_begin,108),time_end)
ELSE worktime END)
FROM tb_worktime 
WHERE time_end>CONVERT(VARCHAR,@date_begin,108))
+(SELECT SUM(CASE 
WHEN CONVERT(VARCHAR,@date_end,108)<time_end
THEN DATEDIFF(Minute,time_start,CONVERT(VARCHAR,@date_end,108))
ELSE worktime END)
FROM tb_worktime 
WHERE time_start<CONVERT(VARCHAR,@date_end,108))
+CASE 
WHEN DATEDIFF(Day,@date_begin,@date_end)>1 
THEN (DATEDIFF(Day,@date_begin,@date_end)-1)
*(SELECT SUM(worktime) FROM tb_worktime)
ELSE 0 END
RETURN(@worktime)
END

解决方案 »

  1.   

    其实我不需要什么其他处理 ,只要能求出一天有效工作时间,如果打开三次不好算就打开四次好了   00:00-7:30   11:30-11:50   
    11:50-13:00     17:00-24:00
    Userid CheckTime            
    10001 2009-1-1 7:26:00                
    10001 2009-1-1 11:35:00 
    10001 2009-1-1 11:55:00                
    10001 2009-1-1 17:12:00      
    10001 2009-1-2 7:40:00                
    10001 2009-1-2 11:35:00
    10001 2009-1-2 11:55:00                 
    10001 2009-1-2 17:12:00              
    10002 2009-1-1 7:27:00                
    10002 2009-1-1 11:35:00 
    10002 2009-1-1 11:55:00                
    10002 2009-1-1 17:27:00                
    10002 2009-1-2 7:35:00                
    10002 2009-1-2 11:40:00 
    10002 2009-1-2 11:55:00                
    10002 2009-1-2 17:27:00