不同人员的日期之间的SQL持续时间

时间:2013-06-07 13:21:45

标签: sql duration

希望有人可以帮我完成以下任务: 我有2桌治疗和'人'。 Treatment包含开始治疗不同人的日期,人包含个人信息,例如姓氏。

现在我必须找到所有在第一次和最后一次治疗之间的持续时间超过20年的人。 表格看起来像这样:

Person
| PK_Person | First name | Name |
_________________________________
| 1 | A_Test | Karl |
| 2 | B_Test | Marie |
| 3 | C_Test | Steve |
| 4 | D_Test | Jack |

Treatment
| PK_Treatment | Description | Starting time | PK_Person |
_________________________________________________________
| 1 | A | 01.01.1989 | 1
| 2 | B | 02.11.2001 | 1
| 3 | A | 05.01.2004 | 1
| 4 | C | 01.09.2013 | 1
| 5 | B | 01.01.1999 | 2

所以在这个例子中,输出应该是人Karl,A_Test。

希望问题是可以理解的,有人可以帮助我。

编辑:格式化似乎有问题,表格显示不正确,我希望它的可读性。

3 个答案:

答案 0 :(得分:0)

SELECT *
FROM person p
INNER JOIN Treatment t on t.PK_Person = p.PK_Person 
WHERE DATEDIFF(year,[TREATMENT_DATE_1], [TREATMENT_DATE_2]) > 20

这应该这样做,但是未经测试,因此需要调整到您的架构

答案 1 :(得分:0)

您的数据看起来有点可疑,因为名字看起来不像名字。

但是,您要做的是为每个人聚合Treatment表并获得最小和最大开始时间。当差异大于20年时,请保留此人,并加入人员表以获取姓名。

select p.FirstName, p.LastName
from Person p join
     (select pk_person, MIN(StartingTime) as minst, MAX(StartingTime) as maxst
      from Treatment t
      group by pk_person
      having MAX(StartingTime) - MIN(StartingTime) > 20*365.25
     ) t
     on p.pk_person = t.pk_person;

请注意,日期算术确实因数据库而异。在大多数数据库中,取两个日期的差异计算它们之间的天数,因此这是一种非常通用的方法(尽管不能保证适用于所有数据库)。

答案 2 :(得分:0)

我采用了稍微不同的方法,并使用SQL Fiddle来验证以下语句是否有效。

如前所述,数据确实有点可疑;尽管如此,您仍可以执行以下操作:

select P.PK_Person, p.FirstName, p.Name
from person P
  inner join treatment T on T.pk_person = P.pk_person
where DATEDIFF((select x.startingtime from treatment x where x.pk_person = p.pk_person order by startingtime desc limit 1), T.StartingTime) > 7305

首先,我们需要内部联接治疗,这将忽略任何不在治疗表中的人。 where 部分现在只需根据您的条件进行选择(在这种情况下是日期的差异)。执行子查询将生成一个人被处理的最后日期,将其与每个记录进行比较,并按天数过滤(7305 = 20年* 365.25)。

Here is the working SQL Fiddle sample.