不同人员日期之间的SQL持续时间
希望有人能帮助我完成以下任务: 我有两张治疗表和“人”<代码>治疗包含开始为不同人员进行治疗的日期,人员包含个人信息,例如姓氏 现在我必须找到第一次和最后一次治疗之间的时间超过20年的所有人。 这些表看起来像这样:不同人员日期之间的SQL持续时间,sql,duration,Sql,Duration,希望有人能帮助我完成以下任务: 我有两张治疗表和“人”治疗包含开始为不同人员进行治疗的日期,人员包含个人信息,例如姓氏 现在我必须找到第一次和最后一次治疗之间的时间超过20年的所有人。 这些表看起来像这样: Person | PK_Person | First name | Name | _________________________________ | 1 | A_Test | Karl | | 2 | B_Test | Marie | | 3 | C_Test | Steve | | 4
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
所以在这个例子中,输出应该是person Karl,A_Test
希望问题是可以理解的,有人可以帮助我
编辑:格式似乎有问题,表格显示不正确,希望可读
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
这应该可以做到,但是它未经测试,因此需要调整您的模式您的数据看起来有点可疑,因为名字看起来不像名字 但是,您要做的是为每个人聚合
治疗
表,并获得最小和最大开始时间。当差异大于20年时,保留person,并连接回person表以获取名称
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;
请注意,日期算法在数据库之间确实有所不同。在大多数数据库中,使用两个日期的差值计算两个日期之间的天数,因此这是一种非常通用的方法(尽管不能保证对所有数据库都有效)。我使用了一种稍微不同的方法,并使用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
首先,我们需要内部连接treatments,它将忽略不在治疗表中的任何人。where部分现在只需要根据您的标准进行选择(在本例中是日期差异)。执行子查询将生成一个人接受治疗的最后日期,将其与您的每个记录进行比较,并按天数进行筛选(7305=20年*365.25)