Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL计算几个月内的疾病天数_Sql_Sql Server_Date_Reporting Services_Calculation - Fatal编程技术网

SQL计算几个月内的疾病天数

SQL计算几个月内的疾病天数,sql,sql-server,date,reporting-services,calculation,Sql,Sql Server,Date,Reporting Services,Calculation,我目前有一个非常糟糕的书面查询,它计算出了几个月内的实际病假(例如,如果员工的病假开始日期为2017年1月1日,结束日期为2017年3月1日,它将计算出他们应该工作的所有病假(例如,周一至周五,但没有固定的工作模式)并在他们生病的几个月内分开工作)。当前报告运行一个会计年度需要10分钟以上 我想重新编写查询,使其性能更好,并且(可能)更准确 我有三个主要的工作表: 员工填写开始时间和结束时间的“活动”表。因为这记录了所有的活动,所以他们的午休时间显示为活动的间隙-[----]午休时间[----

我目前有一个非常糟糕的书面查询,它计算出了几个月内的实际病假(例如,如果员工的病假开始日期为2017年1月1日,结束日期为2017年3月1日,它将计算出他们应该工作的所有病假(例如,周一至周五,但没有固定的工作模式)并在他们生病的几个月内分开工作)。当前报告运行一个会计年度需要10分钟以上

我想重新编写查询,使其性能更好,并且(可能)更准确

我有三个主要的工作表:

  • 员工填写开始时间和结束时间的“活动”表。因为这记录了所有的活动,所以他们的午休时间显示为活动的间隙-[----]午休时间[----]
  • 显示疾病开始日期和结束日期的疾病表
  • 一个日历表,它有你能想象到的所有格式的日期
下表举例

疾病表:

 EMP ID | Start Date       | End Date         | Location ID 
--------|------------------|------------------|-------------
 1      | 01/02/2017 08:30 | 19/03/2017 23:59 | 20          
 2      | 04/02/2017 08:30 | 06/02/2017 23:59 | 4           
 3      | 02/02/2017 09:00 | 03/02/2017 23:59 | 15          
 4      | 03/02/2017 08:45 | 03/02/2017 23:59 | 7           
 5      | 05/02/2017 08:30 | 10/04/2017 23:59 | 9           
活动表:

| EMP ID | Start Date       | End Date         | Activity Type | Location ID | Group ID |
|--------|------------------|------------------|---------------|-------------|----------|
| 1      | 02/01/2017 13:18 | 02/01/2017 17:00 | 11            | 20          | 1        |
| 1      | 02/01/2017 08:30 | 02/01/2017 12:12 | 11            | 20          | 1        |
| 2      | 02/01/2017 13:18 | 02/01/2017 17:00 | 13            | 4           | 4        |
| 2      | 02/01/2017 08:30 | 02/01/2017 12:12 | 13            | 4           | 4        |
| 3      | 02/01/2017 13:18 | 02/01/2017 17:00 | 1             | 15          | 2        |
| 3      | 02/01/2017 08:30 | 02/01/2017 12:12 | 1             | 15          | 2        |
| 4      | 02/01/2017 13:18 | 02/01/2017 17:00 | 4             | 7           | 5        |
| 4      | 02/01/2017 08:30 | 02/01/2017 12:12 | 4             | 7           | 5        |
| 5      | 02/01/2017 13:18 | 02/01/2017 17:00 | 10            | 9           | 3        |
| 5      | 02/01/2017 08:30 | 02/01/2017 12:12 | 10            | 9           | 3        |
| 5      | 02/01/2017 17:00 | 02/01/2017 18:00 | 3             | 9           | 3        |
结果将在SSR表/矩阵中使用,如下所示:

| Group | Location | Total Sickness Days - Months (fiscal year -   April-Mar) |
|-------|----------|----------------------------------------------------------|
| 1     | 20       | xx                                                       |
| 2     | 4        | xx                                                       |
| 3     | 15       | xx                                                       |
| 4     | 7        | xx                                                       |
| 5     | 9        | xx                                                       |
我不确定这样一个问题的最佳做法是什么。我们将非常感谢您的帮助

编辑:逻辑

  • 当某人生病超过其工作日的50%时,病假被计算在内。如果有人在工作日工作了50%后生病回家,这不算一天
  • 改天轮班不会重叠

病假是否算作特定日期的任何疾病?如果有人因病早退怎么办?你还把这算一整天吗?是否有人轮班超过两个日期(工作时间超过午夜)。让我们知道您要用于计算的逻辑。据我所知,每个班次都有多个活动行。不幸的是,如果没有每个班次唯一的班次标识符,我认为您将无法按照自己的意愿进行计算。正如你在最初的问题中提到的,当前的代码可能不准确。我明白你的意思。如果一次轮班从晚上8点开始,第二天早上6点结束,那么疾病日就是轮班开始的那一天——这会改变情况吗?问题是我们无法知道轮班的构成。假设我连续工作两天。这两天我从晚上8点开始,在凌晨1点吃午饭,在早上6点结束。因此,每班有3条记录,第一天1条,第二天2条。这意味着第二天会有3条记录,但它们是针对2个不同的班次的。如果无法确定哪些行与哪个班次相关,我们就无法计算您需要什么。让我们忽略这样一个事实,即有些员工的合同可以延长一天,我该如何处理其他情况,即病假日在一天之内?这可能吗?