我是SQL的新手,但我想我几乎就是这个。我有一个带有名为SicknessLog的表的ms访问数据库。字段是ID,StaffName,[Start / Return],Date。
当一名工作人员因疾病而下班时,会在表格中添加一条记录,并且[开始/返回]字段中的值为1.当他们返回工作时,会添加一条新记录,但相同的详细信息除外[Start / Return]字段为0.
我正在尝试编写一个查询,显示员工生病时([开始/返回]值为-1)和他们返回工作之间的天数([开始/返回]值为0) )
到目前为止,我有这个
SELECT [staffname], DATEDIFF("d", min([date]), max([date])) as [Days Sick]
FROM sicknesslog
WHERE [date] > (now()-30)
GROUP BY [staffname]
这显示了每个工作人员在过去30天内休假的天数。我唯一的问题是,目前离开的员工也列出0天。如果可能的话,我希望它能显示自从他们因为没有回来的工作人员生病以来的天数。
提前感谢您提供任何帮助
答案 0 :(得分:1)
注意:这是SQL Server
语法。
这个想法:
1. a
表将让所有员工最近缺席开始和结束
2.一旦我们得到了这个,我们就会计算出日差,以防缺席情况是"在范围内" (在您的示例中为最后30天),如果不是,我们会使用您示例中的Dateadd(day, -30, GETDATE())
或(now()-30)
- 同样适用于结束日期 - 如果缺席仍在进行中,请使用查询'确定天数的结束日期......(now()
)
select distinct a.staffname, IsNULL(Datediff(DAY,
case when a.LastAbsenceStarted between Dateadd(day, -30, GETDATE()) and GETDATE() then a.LastAbsenceStarted
else Dateadd(day, -30, GETDATE()) End, case when a.LastAbsenceEnded is null then GETDATE() else a.LastAbsenceEnded End), 0) as absences
from
(
SELECT [staffname], (select max([date]) from sicknesslog s where s.staffname = ss.staffname and [start/return] = 1)as [LastAbsenceStarted],
(select max([date]) from sicknesslog s where s.staffname = ss.staffname and [start/return] = 0)as [LastAbsenceEnded]
FROM sicknesslog ss
GROUP BY [staffname]
) a inner join sicknesslog b on a.staffname = b.staffname
where b.Date between Dateadd(day, -30, GETDATE()) and GETDATE()
希望这可以帮助您相应地构建Access
查询。
答案 1 :(得分:1)
尝试这样的事情:
SELECT [staffname], DATEDIFF("d", min([date]), GETDATE()) as [Days Sick]
FROM sicknesslog
WHERE [Start/Return] != 0
GROUP BY [staffname]