【问题标题】:Counting days between two dates access based on field type根据字段类型计算两个日期访问之间的天数
【发布时间】:2016-03-18 18:04:52
【问题描述】:

我有一个包含时间段的第一个和最后一个日期的表格,我需要计算这两个日期之间的天数“sickness”。我无法让计数正常工作。我设置的计数是计算每天生病的次数,而不考虑下面的时间段,这就是我的意思的一个例子。

EAN      FirstDate    LastDate  DaysLost
24659   02/03/2016  04/03/2016  5
24659   07/03/2016  08/03/2016  5
14659   23/02/2016  26/02/2016  14
14659   29/02/2016  04/03/2016  14
14659   07/03/2016  11/03/2016  14

我想看到的是:

EAN      FirstDate    LastDate  DaysLost
24659   02/03/2016  04/03/2016  3
24659   07/03/2016  08/03/2016  2
14659   23/02/2016  26/02/2016  4
14659   29/02/2016  04/03/2016  5
14659   07/03/2016  11/03/2016  5

从第一个日期到最后一个日期有两个类别,它们是“rest day”和“sickness”。我只对第一个日期和最后一个日期之间因“sickness”而损失的天数感兴趣。

第一个和最后一个日期取自tmp_table,该tmp_table 从包含每个人所有日期的表中提取数据。然后计算休息日和病假的连续天数,得到一个缺勤期。

有没有办法让我在两个日期之间看到“sickness”?

当前查询:

SELECT tbl_PaysysData.EAN, tmp_Occurences.FirstDate, tmp_Occurences.LastDate, Count(dim_AbsenceTypes.AbsenceType) AS DaysLost INTO tmp_OccurencesandDaysLost
FROM (tmp_Occurences INNER JOIN tbl_PaysysData ON tmp_Occurences.EAN = tbl_PaysysData.EAN) INNER JOIN dim_AbsenceTypes ON tbl_PaysysData.AbsenceType = dim_AbsenceTypes.AbsenceType
WHERE (((dim_AbsenceTypes.AbsenceType)="sickness"))
GROUP BY tbl_PaysysData.EAN, tmp_Occurences.FirstDate, tmp_Occurences.LastDate;

【问题讨论】:

  • 向我们展示您当前的查询!
  • 这可能会有所帮助!见上文
  • 您只需要这些日期之间的差异,对吧?
  • 不,不完全是,第一个日期和最后一个日期有两个类别; “休息日”和“生病”。我想知道这两个日期之间有多少天是“病”。

标签: sql ms-access


【解决方案1】:

这还不够吗? DATEDIFF 会给你这些日期之间的差异,即实际生病的天数?

SELECT 
    tbl_PaysysData.EAN, 
    tmp_Occurences.FirstDate, 
    tmp_Occurences.LastDate,
    DATEDIFF(day,tmp_Occurences.FirstDate,tmp_Occurences.LastDate) AS DaysLost 
INTO tmp_OccurencesandDaysLost
FROM tmp_Occurences 
INNER JOIN tbl_PaysysData ON tmp_Occurences.EAN = tbl_PaysysData.EAN 
INNER JOIN dim_AbsenceTypes ON tbl_PaysysData.AbsenceType = dim_AbsenceTypes.AbsenceType
WHERE dim_AbsenceTypes.AbsenceType="sickness"
GROUP BY tbl_PaysysData.EAN, tmp_Occurences.FirstDate, tmp_Occurences.LastDate;

【讨论】:

  • 两个日期之间的病假不一定是差异,尽管这是问题所在。 firstdate 和 lastdate 可以混合使用“休息日”和“生病”。我需要知道 firstdate 和 lastdate 之间有多少天生病。我汇总的查询只是为我提供了因疾病而损失的所有天数,无论我的原始问题的第一个表中的 firstdate 和 lastdate 是什么。
  • 嗨 Noobie, 只是尝试运行您的查询,但我得到一个缺少运算符的语法错误,我似乎找不到它。它可能正盯着我看,但我是 SQL 新手,我很难发现它! tmp_Occurences.EAN = tbl_PaysysData.EAN INNER JOIN dim_AbsenceTypes ON tbl_PaysysData.AbsenceType = dim_AbsenceTypes.AbsenceTyp那里的某个地方
  • 如果有两个日期来统计生病,那么可以将其添加到WHERE 条件中,例如两个日期之间的日期。
  • 感谢 Noobie 迄今为止的帮助,您的代码问题是由于缺少括号,因为有多个内部连接。我运行了代码,但它没有给我我需要的东西。我需要知道FromDateToDate 之间的日期中有多少是病态的。因为缺勤期间可以包含sicknessrest Day datediff 只是给出缺勤天数我需要缺勤天数
  • 哦,对不起。我认为您需要记录疾病的日期。
【解决方案2】:

您可以使用这样的查询:

SELECT DATEDIFF(day,'01-01-2016','02-02-2016') AS DaysLost

如果您需要有关 DATEDIFF 函数的更多信息,请阅读以下内容: W3Schools DateDiff

【讨论】:

  • 谢谢 rui,我可以在 datediff 中使用我的 firstdate 和 lastdate 字段吗?
  • 我想是的。你可以试试这样的:SELECT DATEDIFF(day,(Select FirstDate from sickness where EAN=''),(Select LastDate from sickness where EAN='')) AS DaysLost
  • 这是 Access,所以:SELECT DATEDIFF("d",#01-01-2016#,#02-02-2016#) AS DaysLost.
  • 感谢您的指正。我不确定访问语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2019-09-27
相关资源
最近更新 更多