sql 通过某段时间求得改段时间内的工作时长,排除工作日
CREATE FUNCTION Fun_GetTotalHourBySomeTime(@TaskId NVARCHAR(30),@Bu_trupstartDate NVARCHAR(50),@Bu_trupEndDate NVARCHAR(50))
RETURNS FLOAT 
AS
BEGIN
	--计算工作日的天数
	DECLARE @tStartDate DATE
	DECLARE @tEndDate DATE
	SET @tStartDate=CONVERT(NVARCHAR(50),@Bu_trupstartDate,112)
	SET @tEndDate=CONVERT(NVARCHAR(50),@Bu_trupEndDate,112)
DECLARE @DAYNum DATE ,
		@COUNT INT;
	SET @DAYNum = @tStartDate;
	SET @COUNT = 0;
	WHILE @DAYNum <= @tEndDate
    BEGIN
        SET @COUNT = @COUNT + ( CASE DATEPART(WEEKDAY, @DAYNum)
                                  WHEN 1 THEN 0
                                  WHEN 7 THEN 0
                                  ELSE 1
                                END );
        SET @DAYNum = DATEADD(DAY, 1, @DAYNum);
    END
    --工作日的天数先少计算一天;
	SET @COUNT=@COUNT-1;
DECLARE @sResultHour FLOAT
	DECLARE @Day INT 
	DECLARE @startTimeH INT 
	DECLARE @endTimeH INT 
	DECLARE @startTimeM INT
	DECLARE @endTimeM INT 
	--SELECT @sResultHour=8
	SELECT @Day=DATEDIFF(DAY,Bu_trupstartDate,Bu_trupEndDate),@startTimeH=startTimeH,@startTimeM=startTimeM,@endTimeH=endTimeH,@endTimeM=endTimeM
	FROM dbo.VIEW_Apply_Bu_tripReport WHERE taskId=@TaskId
	IF(@Day=0)
	BEGIN	
		IF(@startTimeH<12 AND @endTimeH<=12)
		BEGIN	
			SELECT @sResultHour=CAST(DATEDIFF(MINUTE,Bu_trupstartDate,Bu_trupEndDate)*1./60 AS DECIMAL(18,1)) FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId
		END
		IF(@startTimeH<12 AND @endTimeH>12)
		BEGIN	
			SELECT @sResultHour=(DATEDIFF(HOUR,Bu_trupstartDate,Bu_trupEndDate))-1 FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId
		END
		IF(@startTimeH>=12)
		BEGIN
			SELECT @sResultHour=CAST(DATEDIFF(MINUTE,Bu_trupstartDate,Bu_trupEndDate)*1./60 AS DECIMAL(18,1)) FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId
		END
	END
	IF(@Day>=1)
	BEGIN	
		IF(@startTimeH<12 AND @endTimeH<=12)
		BEGIN	
			SELECT @sResultHour=CAST((@COUNT*7.5*60+(@endTimeH-@startTimeH)*60+(@endTimeM-@startTimeM))*1./60 AS DECIMAL(18,1))
			FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId
		END
		IF(@startTimeH<12 AND @endTimeH>12)
		BEGIN				
			SELECT @sResultHour=CAST((@COUNT*7.5*60+(@endTimeH-@startTimeH-1)*60+(@endTimeM-@startTimeM))*1./60 AS DECIMAL(18,1))
			FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId		
		END
		IF(@startTimeH>=12)
		BEGIN	
			SELECT @sResultHour=CAST((@COUNT*7.5*60+(@endTimeH-@startTimeH)*60+(@endTimeM-@startTimeM))*1./60 AS DECIMAL(18,1))
			FROM VIEW_Apply_Bu_tripReport WHERE  taskId=@TaskId
		END				
	END
	RETURN @sResultHour
END
如有更好的解决思路,还请分享学习,谢谢!!!
sql 通过某段时间求得改段时间内的工作时长,排除工作日的更多相关文章
- JS 获取一段时间内的工作时长小时数
		本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ... 
- DB2获取有效工作时长函数(排除节假日、排除午休时间)
		CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ... 
- 《java编程思想》读书笔记 暂停一段时间,改为上面的练习题
		发现个很尴尬的现象.我一天实在看得太快了...全写下 写博客都得一晚上.. 之前因为是第一次看这么厚的书,别人都说很难,以为会看很慢的.然而,已经完全学过Java的 我感觉没啥压力,越看越快....第 ... 
- java 每间隔一段时间执行一段代码
		Java中java.util.Timer类中有若干个schedule的重载方法,其中 void schedule(TimerTask task, long delay, long period ) 安 ... 
- 如何在JAVA中每隔一段时间执行一段程序
		可以用线程来做,每隔几秒开一个线程代码如下 public void runTask() { final long timeInterval = 120000;// 两分钟运行一次 final Thre ... 
- java如何实现入职时间到现在 java如何计算知道入职时间,   求工作时长格式为年--月--日。
		Date ruZhi = new Date("入职年月bai"); Date now = new Date(); //算出du来时间夸格zhi多长 long shiChang = ... 
- delphi中我用定时器每隔一段时间执行操作
		delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquer ... 
- JIRA开启时间追踪并为问题记录工作日志
		在升级版的JIRA中(4.2or4.3),我们可以使用其记录工作日志的功能.之前研究了很长时间,就是找不到初始预估时间在哪里设置,但是剩余工作时间与耗费时间都可以填写.根据官网的帮助文档也没找到合适的 ... 
- 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。
		如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ... 
随机推荐
- 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
			这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ... 
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
			八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ... 
- 2015 Multi-University Training Contest 1 hdu 5290 Bombing plan
			Bombing plan Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ... 
- codevs1281 矩阵乘法 快速幂  !!!手写乘法取模!!! 练习struct的构造函数和成员函数
			对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些 ... 
- @SpringBootApplication cannot be resolved to a type In STS
			@SpringBootApplication cannot be resolved to a type In STS 学习了:https://stackoverflow.com/questions/4 ... 
- hadoop-02-关闭防火墙
			hadoop-02-关闭防火墙 su root service iptables status #查看状态 即时关闭: service iptables stop #关闭 重启之后关闭: chkcon ... 
- Android Application 类共享全局数据
			android系统会为每一个程序执行时创建一个Application类的对象且仅创建一个.所以Application能够说是单例模式的一个类.且application对象的生命周期是整个程序中最长的, ... 
- MDNS的漏洞报告——mdns的最大问题是允许广域网的mdns单播查询,这会暴露设备信息,或者被利用用于dns放大攻击
			Vulnerability Note VU#550620 Multicast DNS (mDNS) implementations may respond to unicast queries ori ... 
- canvas指定的宽高写在行间和写在style里面的区别?
			上代码,指定的canvas宽高都一样,线条的粗细都是5px 1.宽:400:高:300:直接写在<canvas>里的效果: 2.删除<canvas>里的宽高,宽:400:高:3 ... 
- Android项目实战(四十四):浅谈Postman (网络请求调试插件)
			前言: Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 在项目开发中,可以依赖此工具模拟API测试. 使用详解: 各种情况Api的模拟请求的Postman使用方 ... 
