请假两时间的小时数差

/*
* 请假两时间的小时数差
*/
create PROCEDURE [dbo].[os_vocation_hour]
@starttime varchar(20), --开始时间
@endtime varchar(20) --结束时间

AS
if(isdate(@starttime)=0 or isdate(@endtime)=0) --非日期格式
begin
select 0
end
else --正常日期格式
begin
declare @day_jg varchar(20),@day_num float,@hour_num float,@hour_temps float,@hour_tempe float -- 声明三个变量
declare @s1 datetime,@e1 datetime,@num_old float

set @hour_temps=DatePart(Hour,@starttime) --获取开始小时
set @hour_tempe=DatePart(Hour,@endtime) --获取结束小时

if(@hour_temps>=8 and @hour_temps<=17 and @hour_tempe>=8 and @hour_tempe<=17) --白班
begin
select @hour_num=datediff(hour,cast(@starttime as datetime),cast(@endtime as datetime)) -- 获取两时间的小时数的差
select @day_num=datediff(day,cast(@starttime as datetime),cast(@endtime as datetime)) -- 获取两时间的天数的差
if(@day_num=0 and @hour_num>0) --当天
begin
--同天同一上午或同一下午
if((@hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=8 and @hour_tempe<=12) or (@hour_temps>=13 and @hour_temps<=17 and @hour_tempe>=13 and @hour_tempe<=17) )
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))
else if @hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=13 and @hour_tempe<=17 --开始在上午,结束在下午
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60
else --时间段不对
set @day_jg=-1000
end
else if(@day_num=1) --隔天
begin
if(@hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=8 and @hour_tempe<=12) --开始在上午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15
end
else if(@hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=13 and @hour_tempe<=17) --开始在上午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-60
end
else if(@hour_temps>=13 and @hour_temps<=17 and @hour_tempe>=8 and @hour_tempe<=12) --开始在下午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60*15
end
else if(@hour_temps>=13 and @hour_temps<=17 and @hour_tempe>=13 and @hour_tempe<=17) --开始在下午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15
end
end
else if(@day_num>1) --多天
begin
if(@hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=8 and @hour_tempe<=12) --开始在上午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-(@day_num-1)*24*60
end
else if(@hour_temps>=8 and @hour_temps<=12 and @hour_tempe>=13 and @hour_tempe<=17) --开始在上午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-60-(@day_num-1)*24*60
end
else if(@hour_temps>=13 and @hour_temps<=17 and @hour_tempe>=8 and @hour_tempe<=12) --开始在下午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60*15-(@day_num-1)*24*60
end
else if(@hour_temps>=13 and @hour_temps<=17 and @hour_tempe>=13 and @hour_tempe<=17) --开始在下午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-(@day_num-1)*24*60
end
--处理小时 --处理天数
set @[email protected]_num
set @[email protected]

while(@s1<[email protected]) --用while循环判断是否周末
begin
if(datename(weekday,@s1)=‘星期六‘ or datename(weekday,@s1)=‘星期日‘) --是周末,则天数减1
set @[email protected]_num-1
set @s1=dateadd(day,1,@s1) --下一天
end
set @[email protected]_num-1 --天数少1
set @[email protected][email protected]_num*8*60 --得出分钟数
end

end
else if((@hour_temps>=20 and @hour_temps<=24 or @hour_temps>=0 and @hour_temps<=5) and (@hour_tempe>=20 and @hour_tempe<=24 or @hour_tempe>=0 and @hour_tempe<=5)) --夜班
begin
set @starttime=dateadd(Hour,-12,@starttime) --提前12小时
set @endtime=dateadd(Hour,-12,@endtime)
select @day_num=datediff(day,@starttime,@endtime) -- 获取两时间的天数的差
select @hour_num=datediff(hour,cast(@starttime as datetime),cast(@endtime as datetime))
set @hour_temps=DatePart(Hour,@starttime) --获取开始小时
set @hour_tempe=DatePart(Hour,@endtime) --获取结束小时

if(@day_num=0 and @hour_num>0) --当天
begin
--同天同一上午或同一下午
if((@hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=8 and @hour_tempe<=13) or (@hour_temps>=14 and @hour_temps<=17 and @hour_tempe>=14 and @hour_tempe<=17))
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))
else if @hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=14 and @hour_tempe<=17
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60
else --时间段不对
set @day_jg=-1000
end
else if(@day_num=1) --隔天
begin
if(@hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=8 and @hour_tempe<=13) --开始在上午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15
end
else if(@hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=14 and @hour_tempe<=17) --开始在上午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-60
end
else if(@hour_temps>=14 and @hour_temps<=17 and @hour_tempe>=8 and @hour_tempe<=13) --开始在下午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60*15
end
else if(@hour_temps>=14 and @hour_temps<=17 and @hour_tempe>=14 and @hour_tempe<=17) --开始在下午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15
end
end
else if(@day_num>1) --多天
begin
if(@hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=8 and @hour_tempe<=13) --开始在上午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-(@day_num-1)*24*60
end
else if(@hour_temps>=8 and @hour_temps<=13 and @hour_tempe>=14 and @hour_tempe<=17) --开始在上午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-60-(@day_num-1)*24*60
end
else if(@hour_temps>=14 and @hour_temps<=17 and @hour_tempe>=8 and @hour_tempe<=13) --开始在下午,结束在上午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60*15-(@day_num-1)*24*60
end
else if(@hour_temps>=14 and @hour_temps<=17 and @hour_tempe>=14 and @hour_tempe<=17) --开始在下午,结束在下午
begin
set @day_jg=datediff(mi,cast(@starttime as datetime),cast(@endtime as datetime))-60-60*15-(@day_num-1)*24*60
end
--处理小时 --处理天数

set @[email protected]_num
set @[email protected]

while(@s1<[email protected]) --用while循环判断是否周末
begin
if(datename(weekday,@s1)=‘星期六‘ or datename(weekday,@s1)=‘星期日‘) --是周末
set @[email protected]_num-1
set @s1=dateadd(day,1,@s1) --下一天
end
set @[email protected]_num-1
set @[email protected][email protected]_num*8*60
end
end
else --有问题的时间
begin
set @day_jg=-1000
end
set @[email protected]_jg/60/8 --从分钟数得出天数
if(@day_jg>0 and @day_jg<8*60) --不足8小时,算0.5天
set @day_num=0.5
else if(@day_jg>8*60 and (@day_jg /60) % 8 !=0) --超过8小时,被8整除,有余的,加0.5天
set @[email protected]_num+0.5
declare @t float
set @t= cast((cast(@day_jg as decimal(10,3))/60) as decimal(10,1)) --时数
select case when @t-floor(@t)>0 and @t-(floor(@t)+0.5)<=0 then (floor(@t)+0.5) when @t-(floor(@t)+0.5)>0 then (floor(@t)+1) else floor(@t) end
end

时间: 2024-10-13 05:48:25

请假两时间的小时数差的相关文章

MySQL两时间计算、年份差、月份差、天数差

1. 获取当前日期 SELECT NOW(),CURDATE(),CURTIME() 结果类似:   NOW() CURDATE() CURTIME()   2016-08-01 16:25:46 2016-08-01 16:25:46 2. 获取前一天 SELECT  DATE_SUB(CURDATE(),INTERVAL 1 DAY); 当前日期2018-09-17 结果: 3. 获取后一天 SELECT  DATE_SUB(CURDATE(),INTERVAL -1 DAY); 当前日期2

oracle两时间相减得到相差的时间

1.months_between(date1,date2);date1和date2相减得到相差的月份. select months_between(to_date('2015-05-11','yyyy-MM-dd'),to_date('2015-04-11','yyyy-MM-dd')) from dual :相差一个月. 2.ceil(date1-date2);date1-date2相减得到相差的天数 select ceil(To_date('2015-05-11 00:00:00' , 'y

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() 实现. 函数 TimeStampDiff() 是MySQL本身提供的可以计算两个时间间隔的函数,语法为: TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之

ORACEL数据库获取两个时间之前的小时数

一.获取两个时间之前的小时数 select ceil((To_date('2008-05-01 02:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')) * 24 ) 在厂小时数 FROM SCM_GDHJLD2 二.截取字符串 select substr(DIAODAOJIAOWANSHIJIAN,1,18) from SCM_GDHJLD2

输入两个时间戳,计算差值

<?php date_default_timezone_set("Asia/Shanghai"); //date_default_timezone_set("UTC"); //date_default_timezone_set("PRC"); //输入两个时间戳,计算差值,也就是相差的小时数,如返回2:10,则表示输入的两个时间相差2小时10分钟  function hours_min($start_time,$end_time){  if

java计算两日期间隔小时或分钟

public static void main(String[] args) {        try {            long min = dateDiff("2014-05-27 13:30:00","2014-05-27 13:00:00","yyyy-MM-dd HH:mm:ss");            System.out.println("---------相隔分钟数: "+min);        

Js计算时间差,天数,小时数,余数

var begintime_ms = Date.parse(new Date(begintime.replace(/-/g, "/"))); //begintime 为开始时间 var endtime_ms = Date.parse(new Date(endtime.replace(/-/g, "/"))); // endtime 为结束时间 得到的结果为 毫秒数,可根据 毫秒数的大小,来判断时间. 当然根据毫秒数 可以根据他们的差值 来求相差的天数或是小时等. -

获取两个字符串日期的差值的方法

日期的格式:“yymmddhhmmss”是一个字符串,计算两个日期之间的差值,显然就是计算两个日期之间相差的秒数,有个简洁的方法是将字符串转化为time_t格式,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数 我们可以看到它的定义是这样的 #ifndef _TIME_T_DEFINEDtypedef long time_t;           /* 时间值 */#define _TIME_T_DEFINED       /* 避免重复定义

Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一个数组定义困难值是两个相邻元素之间差的最大值。 给一个数组,可以去掉任意一个元素,问剩余数列的困难值的最小值是多少】

A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Mike is trying rock climbing but he is awful at it. There are n holds on the wall, i-th hold is at height ai off the g