如何总结两个日期之间的注册时间(不仅仅是两个日期之间的总小时数)

时间:2015-03-12 13:46:07

标签: sql-server-2008

我找不到与我相匹配的问题。如果你知道,请告诉我。

我需要一个选择语句,向我显示员工在约会之间的总缺勤时间。

示例:

员工丹尼斯于2014-06-10至2014-06-13缺席。 该员工的日期之间有不同的缺勤时间。 让我们说丹尼斯一直缺席:

2014-06-10: 477 minutes
2014-06-11: 498 minutes
2014-06-12: 491 minutes
2014-06-13: 397 minutes
total absence: 1863 minutes

我想获得这样的输出:

我的桌子员工时间每天都有缺勤时间。
AbsenceDays 有缺席日期和截止日期

EmployeeTime看起来像这样:

| EmployeeName | Date | RegisteredHour |

和AbsenceDays看起来像这样:

| FromDate | TillDate | AbsenceId | KeyNo |

我有第三个表 LogTable ,它可以通过KeyNo和EmployeeId将这两个表链接在一起。

我得到的输出:

| EmployeeName | FromDate   | TillDate   | Days |Days without weekends | Date       | RegisteredHour | Total min absence
| Dennis       | 2014-06-10 | 2014-06-13 | 4    |        4             | 2014-06-10 | 477            | 9540
| Dennis       | 2014-06-10 | 2014-06-13 | 4    |        4             | 2014-06-11 | 498            | 9960
| Dennis       | 2014-06-10 | 2014-06-13 | 4    |        4             | 2014-06-12 | 491            | 9960
| Dennis       | 2014-06-10 | 2014-06-13 | 4    |        4             | 2014-06-13 | 397            | 7940
| Joanne       | 2014-05-09 | 2014-05-12 | 4    |        2             | 2014-05-09 | 420            | 2100
| Joanne       | 2014-05-09 | 2014-05-12 | 4    |        2             | 2014-05-10 | 0              | 0
| Joanne       | 2014-05-09 | 2014-05-12 | 4    |        2             | 2014-05-11 | 0              | 0
| Joanne       | 2014-05-09 | 2014-05-12 | 4    |        2             | 2014-05-12 | 450            | 2250

我需要得到这个结果:

| EmployeeName | FromDate   | TillDate   | Days |Days without weekends | Total min absence
| Dennis       | 2014-06-10 | 2014-06-13 | 4    |        4             | 1863
| Joanne       | 2014-06-09 | 2014-06-12 | 4    |        2             | 870

我的代码:

SELECT DISTINCT 
    EmployeeTime.Name,
    CONVERT(VARCHAR(10),FromDate,20) FromDate,
    CONVERT(VARCHAR(10),Tilldate,20) Tilldate,
    (DATEDIFF(DD, FromDate, Tilldate) +1) TotalDays,
    (DATEDIFF(DD, FromDate, Tilldate) +1) - (DATEDIFF(wk, FromDate, Tilldate) * 2) DaysMinusWeekends,
    CONVERT(VARCHAR(10),Dato,105) DateDato,
    RegisteredHour,
    SUM(RegisteredHour) Total
FROM EmployeeTime, AbsenceDays, LogTable
WHERE EmployeeTime.EmployeeId = LogTable.EmployeeId
    AND LogTable.KeyNo = AbsenceDays.KeyNo
    AND EmployeeTime.EmployeeId = 'D994'
    AND (DATEDIFF(DD, FromDate, TillDate) +1) = 4
    AND CONVERT(VARCHAR(10),FromDate,20) <= CONVERT(VARCHAR(10),Dato,20)
    AND CONVERT(VARCHAR(10),TillDate,20) >= CONVERT(VARCHAR(10),Dato,20)
    GROUP BY EmployeeTime.EmployeeId,FromDate, TillDate, Dato, RegisteredHour
    ORDER BY EmployeeTime.EmployeeId

注意:我需要一个答案,你不自行连接表或使用WITH查询; SELECT必须是SQL中的第一件事,否则程序就无法理解它。

1 个答案:

答案 0 :(得分:0)

这是我对答案的最佳猜测。它可能不适合你,因为:(1)我不知道所有表的完整表模式; (2)我不明白你的意思是“我需要你不加表的答案”; (3)我只知道PostgreSQL,而不是SQL Server。

在英语中,您要做的是选择一行AbsenceDays,然后使用FromDateTillDateEmployeeTime中选择一组行,并且然后将那些中的RegisteredHour列加起来而不是绝对日期差。最明显的方法是

SELECT et.EmployeeName, ad.FromDate, ad.TillDate, SUM(et.RegisteredHour)

  FROM LogTable lt
  JOIN EmployeeTime et ON lt.EmployeeId = et.EmployeeId
  JOIN AbsenceDays ad  ON lt.KeyNo      = ad.KeyNo

 WHERE et.Date >= ad.FromDate
   AND et.Date <= ad.TillDate
-- AND et.EmployeeName = 'Dennis'

 GROUP BY et.EmployeeName, ad.FromDate, ad.TillDate
 ORDER BY et.EmployeeName, ad.FromDate;

回顾你的代码,看起来你基本上已经嵌入了这个代码,但是对我来说似乎没有多少CONVERT和DATEDIFF混淆了。这可能是因为,我只知道PostgreSQL。我建议您将代码删除到最低限度,如此,然后重新添加转换,直到数据库接受它为止。

另一个潜在的问题是if(EmployeeName,FromDate,TillDate)不能唯一地识别一个连续缺席。 (你似乎在AbsenceDays中有两个ID列;这表明这可能是一个问题。)你也谈论了几分钟和几小时,所以我不知道你真正想要的是什么。最后,我不知道如何计算非周末天数。