【问题标题】:SQL duration between dates for different persons不同人的日期之间的 SQL 持续时间
【发布时间】:2013-06-07 13:21:45
【问题描述】:

希望有人可以帮助我完成以下任务: 我有 2 张桌子治疗和“人”。 Treatment 包含开始对不同人进行治疗的日期,Person 包含个人信息,例如姓氏。

现在我必须找到所有第一次和最后一次治疗之间的持续时间超过 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

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

希望它可以理解问题所在,并且有人可以帮助我。

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

【问题讨论】:

    标签: sql duration


    【解决方案1】:
    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
    

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

    【讨论】:

      【解决方案2】:

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

      但是,您要做的是汇总每个人的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;
      

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

      【讨论】:

        【解决方案3】:

        我采用了一种稍微不同的方法,并使用 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.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 2018-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多