找回密码
 立即注册

QQ登录

只需一步,快速开始

左一

高级会员

148

主题

358

帖子

1530

积分

高级会员

积分
1530
左一
高级会员   /  发表于:2024-11-14 10:08  /   查看:132  /  回复:5
1金币
想试着做一个请假表,第一步就难住了。时长怎么计算?
  1. 字段有start_day、end_day、start_part(上午、下午)、end_part(上午、下午),例如start_day=2024.11.14,start_part=上午,end_day=2024.11.14,end_part=上午,则值为0.5。start_day=2024.11.14,start_part=上午,end_day=2024.11.14,end_part=下午,则值为1。start_day=2024.11.14,start_part=上午,end_day=2024.11.15,end_part=上午,则值为1.5。start_day=2024.11.14,start_part=上午,end_day=2024.11.15,end_part=下午,则值为2。start_day=2024.11.14,start_part=下午,end_day=2024.11.15,end_part=上午,则值为1。start_day=2024.11.14,start_part=下午,end_day=2024.11.15,end_part=下午,则值为1.5。
复制代码
不知道这个公式该怎么写,然后还要考虑周末的情况。在网上找了一个代码,但不知道怎么用。
  1.     /**
  2.      * 计算小时
  3.      * bDate 开始时间
  4.      * eDate 结束时间
  5.      */
  6.     countHours(start_time_date, start_time_timer, end_time_date, end_time_timer) {
  7.         let bDateDayY = new Date(start_time_date)//开始时间
  8.         let bDateDayT = start_time_timer; // 上午、下午
  9.         let eDateDayY = new Date(end_time_date)//结束时间
  10.         let eDateDayT = end_time_timer;
  11.         let bisweek = bDateDayY.getDay(); //获取开始时间是周几
  12.         let eisweek = eDateDayY.getDay(); //获取结束时间是周几
  13.         if ((bisweek != 0 && bisweek != 6) && (eisweek != 0 && eisweek != 6)) { //开始时间和结束时间都不是周末
  14.             var mosconds = eDateDayY.getTime() - bDateDayY.getTime()  //时间 差的 毫秒数
  15.             let days = (eDateDayY - bDateDayY) / 1000 / 3600 / 24; //计算出相差天数
  16.             let weeks = this.checkWeekend(bDateDayY, eDateDayY, days); //周末天数
  17.             if (weeks > 0) { //有周末
  18.                 days = days - weeks; //去掉周末天数
  19.                 if ((bDateDayT == '下午' && eDateDayT == '上午')) { //开始时间是下午,结束时间是上午
  20.                     days = days - 0.5; //去掉半天
  21.                 }
  22.                 if ((bDateDayT == '下午' && eDateDayT == '下午')) { //开始时间是下午,结束时间是下午
  23.                     days = days; //不用去掉半天
  24.                 }
  25.                 if ((bDateDayT == '上午' && eDateDayT == '下午')) { //开始时间是上午,结束时间是下午
  26.                     days = days + 1; //加一天
  27.                 }
  28.                 if ((bDateDayT == '上午' && eDateDayT == '上午')) { //开始时间是上午,结束时间是上午
  29.                     days = days + 0.5; //加半天
  30.                 }
  31.                 return days; //返回天数
  32.             } else { //没有周末
  33.                 if (mosconds == 0) { //同天
  34.                     if ((bDateDayT == '上午' && eDateDayT == '下午')) { //开始时间是上午,结束时间是下午
  35.                         days = days + 1; //加一天
  36.                     }
  37.                     if (eDateDayT == '上午') { //结束时间是上午
  38.                         days = days + 0.5; //加半天
  39.                     }
  40.                     return days;
  41.                 } else {
  42.                     if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  43.                         days = days + 1;
  44.                     }
  45.                     if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  46.                         days = days + 0.5;
  47.                     }
  48.                     if ((bDateDayT == '下午' && eDateDayT == '上午')) {
  49.                         days = days + 0.5;
  50.                     }
  51.                     if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  52.                         days = days + 0.5;
  53.                     }
  54.                     return days;
  55.                 }
  56.             }
  57.         } else if ((bisweek == 0 || bisweek == 6) || (eisweek == 0 || eisweek == 6)) { //开始时间或结束时间是周末
  58.             if ((bisweek == 6 && eisweek == 0) || (bisweek == 6 && eisweek == 6) || (bisweek == 0 && eisweek == 0)) { //开始时间是周六或周日,结束时间是周日或周六
  59.                 // wx.showModal({
  60.                 //     title: '提示',
  61.                 //     content: '这段时间休息不需要请假!',
  62.                 // })
  63.                 let days = 0;
  64.                 return days;
  65.             } else { //开始时间是周末,结束时间是工作日
  66.                 if (bisweek == 0 || bisweek == 6) {
  67.                     var mosconds = eDateDayY.getTime() - bDateDayY.getTime()  //时间 差的 毫秒数
  68.                     let days = (eDateDayY - bDateDayY) / 1000 / 3600 / 24; //计算出相差天数
  69.                     let weeks = this.checkWeekend(bDateDayY, eDateDayY, days); //周末天数
  70.                     if (weeks > 0) {
  71.                         if (days >= weeks) {
  72.                             days = days - weeks;
  73.                             if ((bDateDayT == '下午' && eDateDayT == '上午')) {
  74.                                 days = days - 0.5;
  75.                             }
  76.                             if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  77.                                 days = days;
  78.                             }
  79.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  80.                                 days = days + 1;
  81.                             }
  82.                             if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  83.                                 days = days + 0.5;
  84.                             }
  85.                         } else {
  86.                             days = 0
  87.                         }
  88.                         return days;
  89.                     } else { //没有周末
  90.                         if (mosconds == 0) { //同天
  91.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  92.                                 days = days + 1;
  93.                             }
  94.                             if (eDateDayT == '上午') {
  95.                                 days = days + 0.5;
  96.                             }
  97.                             return days;
  98.                         } else {
  99.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  100.                                 days = days + 1;
  101.                             }
  102.                             if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  103.                                 days = days + 0.5;
  104.                             }
  105.                             if ((bDateDayT == '下午' && eDateDayT == '上午')) {
  106.                                 days = days + 0.5;
  107.                             }
  108.                             if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  109.                                 days = days + 0.5;
  110.                             }
  111.                             return days;
  112.                         }
  113.                     }
  114.                     // wx.showModal({
  115.                     //     title: '提示',
  116.                     //     content: '开始日期不可为周末',
  117.                     // })
  118.                 }
  119.                 if (eisweek == 0 || eisweek == 6) {
  120.                     var mosconds = eDateDayY.getTime() - bDateDayY.getTime()  //时间 差的 毫秒数
  121.                     let days = (eDateDayY - bDateDayY) / 1000 / 3600 / 24; //计算出相差天数
  122.                     let weeks = this.checkWeekend(bDateDayY, eDateDayY, days); //周末天数
  123.                     if (weeks > 0) {
  124.                         if (days >= weeks) {
  125.                             days = days - weeks;
  126.                             if ((bDateDayT == '下午' && eDateDayT == '上午')) {
  127.                                 days = days + 0.5;
  128.                             }
  129.                             if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  130.                                 days = days + 0.5;
  131.                             }
  132.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  133.                                 days = days;
  134.                             }
  135.                             if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  136.                                 days = days;
  137.                             }
  138.                         } else {
  139.                             days = 0
  140.                         }
  141.                         return days;
  142.                     } else {
  143.                         if (mosconds == 0) { //同天
  144.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  145.                                 days = days + 1;
  146.                             }
  147.                             if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  148.                                 days = days + 0.5;
  149.                             }
  150.                             if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  151.                                 days = days + 0.5;
  152.                             }
  153.                             return days;
  154.                         } else {
  155.                             if ((bDateDayT == '上午' && eDateDayT == '下午')) {
  156.                                 days = days + 1;
  157.                             }
  158.                             if ((bDateDayT == '上午' && eDateDayT == '上午')) {
  159.                                 days = days + 0.5;
  160.                             }
  161.                             if ((bDateDayT == '下午' && eDateDayT == '上午')) {
  162.                                 days = days + 0.5;
  163.                             }
  164.                             if ((bDateDayT == '下午' && eDateDayT == '下午')) {
  165.                                 days = days + 0.5;
  166.                             }
  167.                             return days;
  168.                         }
  169.                     }
  170.                     // wx.showModal({
  171.                     //     title: '提示',
  172.                     //     content: '结束日期不可为周末',
  173.                     // })
  174.                 }
  175.             }
  176.         }

  177.     }
  178.     checkWeekend(beginDay, endDay, days) {
  179.         var weekEndCount = 0;
  180.         if (days < 1) {
  181.             //判断开始时间是否是周末
  182.             if (beginDay.getDay() == 6 || beginDay.getDay() == 0) {
  183.                 weekEndCount += 1;
  184.             }

  185.         } else if (days < 7) {
  186.             if (beginDay.getDay() < endDay.getDay() && endDay.getDay() == 6) {
  187.                 weekEndCount += 1;
  188.             }
  189.             else if (beginDay.getDay() < endDay.getDay() && beginDay.getDay() == 0) {
  190.                 weekEndCount += 1;
  191.             } else if (beginDay.getDay() > endDay.getDay()) {
  192.                 weekEndCount += 2;
  193.             }

  194.         }
  195.         else if (days >= 7) {
  196.             if (days % 7 > 1) {
  197.                 //以周六为界限,判断开始时间和周六的差值与总天数除以7的余数的关系判断是否需要增加额外的周末
  198.                 if (6 - beginDay.getDay() == days % 7) {
  199.                     weekEndCount += parseInt(days / 7) * 2;
  200.                 } else if (6 - beginDay.getDay() + 1 == days % 7) {
  201.                     weekEndCount += parseInt(days / 7) * 2;
  202.                     weekEndCount += 1;
  203.                 } else {
  204.                     weekEndCount += parseInt(days / 7) * 2;
  205.                     weekEndCount += 2;
  206.                 }

  207.             } else {
  208.                 weekEndCount += parseInt(days / 7) * 2;
  209.             }
  210.         }
  211.         return weekEndCount;
  212.     },
复制代码


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

情况一:起止都是上午或者起止都是下午 情况二:起是上午止是下午 情况三:起是下午止是上午

5 个回复

倒序浏览
最佳答案
最佳答案
amtath悬赏达人认证 活字格认证
论坛元老   /  发表于:7 天前
来自 5#


情况一:起止都是上午或者起止都是下午
  1. =(DATEDIF(sd,ed,"D")*2+1)*0.5
复制代码
情况二:起是上午止是下午
  1. =(DATEDIF(sd,ed,"D")+1)
复制代码
情况三:起是下午止是上午
  1. =DATEDIF(sd,ed,"D")
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Grayson.Shang活字格认证 Wyn认证
超级版主   /  发表于:6 天前
2#
大佬您好,关于咱们这个需求,其实并没有那么复杂,活字格在数据库存储的日期类型本身就是整数类型
比如今天是2024/11/15,存储的整数是45611

那么存在请假天数的时候,可以使用结束日期-开启日期+1。



当然,若是还存在节假日的话,这个简单的方案就会有些简陋,咱们可以参考吴小胖老师的帖子哦

【小胖课堂】神奇的Excel函数——这个月要上多少天班啊~NETWORKDAYS函数
https://gcdn.grapecity.com.cn/showtopic-143374-1-1.html
(出处: 葡萄城开发者社区)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
左一
高级会员   /  发表于:6 天前
3#
Grayson.Shang 发表于 2024-11-15 11:14
大佬您好,关于咱们这个需求,其实并没有那么复杂,活字格在数据库存储的日期类型本身就是整数类型
比如今 ...

我发的是有4个参数的,开始日期上午和下午请假,结束日期到上午或下午。请假的单位精确到半天,不是一天。
回复 使用道具 举报
Grayson.Shang活字格认证 Wyn认证
超级版主   /  发表于:6 天前
4#
大佬您好,咱们这个其实实现起来很简单。

若是没有上下午的话,也就是只选择两个日期,或者一个开始日期是上午,结束日期是下午
结束日期 - 开始日期 + 1
若是有上午,那就是将 +1 改成动态运算
若是都是上午,或者都是下午:
结束日期 - 开始日期 + 0.5


我这边做了一个简单的设计,判断两个选择都不为空时,若是选择相同,则返回0.5,否则返回1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Grayson.Shang活字格认证 Wyn认证
超级版主   /  发表于:6 天前
6#
感谢大佬支持
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部