帆软时间日期计算公式

我有一个开始时间和结束时间,如果开始时间和结束时间大于0,就计算他们之间的时差,结束时间必须大于开始时间,然后有个规则,上午只按照3.5个小时计算,下午只按照4个小时计算;但是他们有一种请假的可能,比如上午请假半个小时或者一个小时,或者请假到下午2点,这个公式怎么样写,才能像下面一样获取到天数结果,求求大佬帮忙看看,写了三天了,一直不对image.png

FineReport 快快救我 发布于 2024-4-15 09:42
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
CD20160914Lv8专家互助
发布于2024-4-15 10:27

DATEDIF(B2,A2,"D") + round((if(REPLACE(RIGHT(A2,8),":","") * 1 <= 83000 && REPLACE(RIGHT(B2,8),":","") * 1 >= 173000,7.5,if(REPLACE(RIGHT(A2,8),":","") * 1 <= 83000 && REPLACE(RIGHT(B2,8),":","") * 1 <= 130000,3.5,if(REPLACE(RIGHT(A2,8),":","") * 1 >= 83000 && REPLACE(RIGHT(B2,8),":","") * 1 >= 130000,DATESUBDATE(CONCATENATE(left(B2,10)," 13:00:00"),A2,"s")/3600,4)))/7.5),2)

image.png

最佳回答
0
华莉星宸Lv7资深互助
发布于2024-4-15 09:43

DATEDIF(start_date,end_date,unit,method):返回两个指定日期间的天数、月数或年数。

Start_date:代表所指定时间段的初始日期。

End_date:代表所指定时间段的终止日期。

Unit:函数返回信息的类型。

method:可选参数,默认返回日期差值的绝对值。

若unit="Y",则DATEDIF返回指定时间段的年差数。

若unit="M",则DATEDIF返回指定时间段的月差数。

若unit="D",则DATEDIF返回指定时间段的日差数。

若unit="MD",则DATEDIF忽略年和月,返回指定时间段的日差数。

若unit="YM",则DATEDIF忽略年和日,返回指定时间段的月差数。

若unit="YD",则DATEDIF忽略年,返回指定时间段的日差数。

若method=1,则DATEDIF返回日期差值的绝对值。

若method=-1,则DATEDIF返回日期差值时,会考虑正负情况。

示例:

DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。

DATEDIF("2001/2/28","2004/3/20","M")等于37,即在2001年2月28日与2004年3月20日之间有36个整月。

DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。

DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。

DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。

DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。

最佳回答
0
快乐星光Lv5中级互助
发布于2024-4-15 10:33(编辑于 2024-4-15 11:12)

你这个挺麻烦的,在ds的sql里面处理吧

with AA as (

select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 09:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 09:30:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 11:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 12:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 13:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 14:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 17:00:00' as datetime) edate

union all select cast('2024-04-15 08:30:00' as datetime) sdate,cast('2024-04-15 19:00:00' as datetime) edate

)

select *,(amMinute+(case when pmMinute >=240 then 240 else pmMinute end))*1.000/60/7.5 workdaynum from (

select *,

  case when edate>=(CONVERT(varchar(20),sdate,23) +' 12:00:00')

        then DATEDIFF(minute, sdate, CONVERT(varchar(20),sdate,23)+' 12:00:00') 

else DATEDIFF(minute, sdate, edate) end amMinute,

case when edate>=(CONVERT(varchar(20),sdate,23) +' 13:00:00')

        then DATEDIFF(minute, CONVERT(varchar(20),sdate,23)+' 13:00:00', edate) 

else 0 end pmMinute

from AA ) s

image.png

  • 4关注人数
  • 1036浏览人数
  • 最后回答于:2024-4-15 11:12
    请选择关闭问题的原因
    确定 取消
    返回顶部