我找不到与我相匹配的问题。如果你知道,请告诉我。
我需要一个选择语句,向我显示员工在约会之间的总缺勤时间。
示例:
员工丹尼斯于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中的第一件事,否则程序就无法理解它。
答案 0 :(得分:0)
这是我对答案的最佳猜测。它可能不适合你,因为:(1)我不知道所有表的完整表模式; (2)我不明白你的意思是“我需要你不加表的答案”; (3)我只知道PostgreSQL,而不是SQL Server。
在英语中,您要做的是选择一行AbsenceDays
,然后使用FromDate
和TillDate
在EmployeeTime
中选择一组行,并且然后将那些中的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列;这表明这可能是一个问题。)你也谈论了几分钟和几小时,所以我不知道你真正想要的是什么。最后,我不知道如何计算非周末天数。