多个日期差异

时间:2014-06-14 11:02:56

标签: sql ms-access

我是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天。如果可能的话,我希望它能显示自从他们因为没有回来的工作人员生病以来的天数。

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:1)

注意:这是SQL Server语法。 这个想法:
1. a表将让所有员工最近缺席开始和结束 2.一旦我们得到了这个,我们就会计算出日差,以防缺席情况是"在范围内" (在您的示例中为最后30天),如果不是,我们会使用您示例中的Dateadd(day, -30, GETDATE())(now()-30) - 同样适用于结束日期 - 如果缺席仍在进行中,请使用查询'确定天数的结束日期......(now()

Demo here

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]