sql 计算工作时间的函数
2012-05-10 09:52
274 查看
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) --工作时数(分钟)
)
GO
if 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
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) --工作时数(分钟)
)
GO
if 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
相关文章推荐
- 2.5.4 计算工作时间的函数.sql
- SQL创建计算时间函数
- 为女票写的计算工作时间的SQL(二)
- SQL 拥有很多可用于计数和计算的内建函数。
- SQL学习笔记3 通配符 计算字段 函数 汇总
- SQL 10 函数 3 日期时间函数 - 6 计算一个日期是星期几
- MySQL中计算sql语句影响行数的函数
- 第5天-sql计算字段的创建与基础函数的使用
- [原创]SQL 表值函数:获取从今天计算起往前自定义天数
- SQL Server DATEDIFF() 函数(SQL计算时间差)
- SQL Server DATEDIFF() 函数(SQL计算时间差)
- sql中的内置函数和计算、子查询与连接查询
- SQL Server DATEDIFF() 函数计算sql语句俩个日期间隔
- SQL 7 计算字段 - 3. 数据处理函数
- SQL日期集合-周、月、季度、年等计算以及自定义函数
- sql 语句 编写一个函数用来精确计算某个人的当前年龄(精确到一位小数),比如:20.3岁
- SQL 计算两个地理坐标相差的距离的函数
- SQL中返回计算表达式的函数
- 一般性工作时间计算存储过程(SQL SERVER)
- SQL 函数计算