今天有个问题需要解决,目前还没解决方案呢。
记下此文,以作记录。
问题描述:客户需要对算薪当月的所有加班单进行分析,若加班时间在晚上21:00到凌晨06:00期间全部算作夜班小时数,给予夜班补贴。
有一些比较复杂,比如从下午13点开始加班,加班至凌晨02:00,这中间21:00-02:00的时间算作夜班小时数。
目前还未想到最完美的解决方案。
初步想法是:做一个函数,将加班单号作为参数,最后返回夜班小时数。
比较完整的想法如下:
其中,不同天的结果值应该为:第一天的结果值+中间天的
结果
值+最后一天的结果值。出于效率考虑,可将同一天的 06:00<开始时间<=21:00 和 结束时间<=21:00 放到前面,因为这种情况较多,且返回值为0,不需要计算。
欢迎交流。
函数如下:
--函数传入3个值,分别是 加班单的开始时间、结束时间、以及加班总时数
ALTER FUNCTION [dbo].[fun_cal_night_time] (@p_sdate datetime,@p_edate datetime)
RETURNS numeric(18, 4)
AS
BEGIN
declare @rtn numeric(18, 4) --设定变量,返回函数结果值
declare @rtn1 numeric(18, 4) --设定变量,第一天
declare @rtn2 numeric(18, 4) --设定变量,中间天
declare @rtn3 numeric(18, 4) --设定变量,最后一天
--同一天
if (convert(nvarchar(10),@p_sdate,120)=convert(nvarchar(10),@p_edate,120