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 通过某段时间求得改段时间内的工作时长,排除工作日的更多相关文章

  1. JS 获取一段时间内的工作时长小时数

    本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...

  2. DB2获取有效工作时长函数(排除节假日、排除午休时间)

    CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ...

  3. 《java编程思想》读书笔记 暂停一段时间,改为上面的练习题

    发现个很尴尬的现象.我一天实在看得太快了...全写下 写博客都得一晚上.. 之前因为是第一次看这么厚的书,别人都说很难,以为会看很慢的.然而,已经完全学过Java的 我感觉没啥压力,越看越快....第 ...

  4. java 每间隔一段时间执行一段代码

    Java中java.util.Timer类中有若干个schedule的重载方法,其中 void schedule(TimerTask task, long delay, long period ) 安 ...

  5. 如何在JAVA中每隔一段时间执行一段程序

    可以用线程来做,每隔几秒开一个线程代码如下 public void runTask() { final long timeInterval = 120000;// 两分钟运行一次 final Thre ...

  6. java如何实现入职时间到现在 java如何计算知道入职时间, 求工作时长格式为年--月--日。

    Date ruZhi = new Date("入职年月bai"); Date now = new Date(); //算出du来时间夸格zhi多长 long shiChang = ...

  7. delphi中我用定时器每隔一段时间执行操作

    delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquer ...

  8. JIRA开启时间追踪并为问题记录工作日志

    在升级版的JIRA中(4.2or4.3),我们可以使用其记录工作日志的功能.之前研究了很长时间,就是找不到初始预估时间在哪里设置,但是剩余工作时间与耗费时间都可以填写.根据官网的帮助文档也没找到合适的 ...

  9. 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。

    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ...

随机推荐

  1. 【BZOJ 1212】[HNOI2004]L语言

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为查询的字典里面.单词的最大长度为10 所以. 如果建立一棵字典树的话. 深度最多为10: 那么可以写一个DP; 设f[i]表示1 ...

  2. STL_算法_查找算法(binary_search、includes)

    C++ Primer 学习中.. . 简单记录下我的学习过程 (代码为主) 全部容器适用(O(log(n)))     已序区间查找算法 binary_search             //二分查 ...

  3. android openGL ES2 一切从绘制纹理開始

    纹理.在openGL中,能够理解为载入到显卡显存中的图片.Android设备在2.2開始支持openGL ES2.0.从前都是ES1.0 和 ES1.1的版本号.简单来说,openGL ES是为了嵌入 ...

  4. YTUOJ-计算该日在本年中是第几天(用户自己定义类型)

    题目描写叙述 定义一个结构体变量(包含年.月.日).编写一个函数days,由主函数将年.月.日传递给函数days,计算出该日在本年中是第几天并将结果传回主函数输出. 输入 年月日 输出 当年第几天 例 ...

  5. JDK的安装及配置环境变量

    开发java程序的必备工具:JDK,全名是Java Development Kit, 是Java语言的软件开发工具包. 第一步:下载安装包 从Oracle官网可以选择自己所需的版本下载,(附Oracl ...

  6. window.location.href=*.html访问没反应问题

    window.location.href=*.html访问没反应问题 1.SpringMvc配置中:扫描controller.视图层配置路径是否正确 报doc根路径 <mapper>匹配错 ...

  7. PostgreSQL Replication之第七章 理解Linux高可用(1)

    高可用(HA)是工业长期持续的,不间断的服务.在本章,您将了解高可用软件的历史,概念和实现与PostgreSQL复制和高可用之间的关系. 本章将详细地讲述如下主题: •理解高可用性的目的 •衡量可用性 ...

  8. Linux 运维笔试题(一)答案

    答案:   1. ftp:21    远程连接telnet端口:23  smtp:25   rsync:873 SNMP:161   RPC(Remote Procedure Call,远程过程调用) ...

  9. Display Video

    ###chromium webrtc视频显示 ###两个数据源:本地数据源: MediaStreamRemoteVideoSource(content/renderer/media/webrtc/me ...

  10. LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法

    题目链接:https://cn.vjudge.net/problem/LightOJ-1282 题意 给出两个正整数n(2 ≤ n < 231), k(1 ≤ k ≤ 1e7) 计算n^k的前三 ...