来自两个表的两个最大日期时间值的 Datediff,并根据差异更新第三个表

Posted

技术标签:

【中文标题】来自两个表的两个最大日期时间值的 Datediff,并根据差异更新第三个表【英文标题】:Datediff of two max datetime values from two tables and update a third table based on the difference 【发布时间】:2021-04-04 11:17:49 【问题描述】:

我有三个表 Account、Solditems 和 Appointments。

当相关 SoldItems 和 Appointments 表中的日期差异大于 6 年时,我需要更新每个 Account 行的 IsOverSixYears 列。

一个账号可以有多个Solditems和多个Appointments,所以我需要找到最近售出的商品和最近的预约进行比较,IsOverSixYears标志要根据账号最近售出的商品和预约设置。

这是我的尝试,但结果不好:

    Update AccountBase
    Set  IsOverSixYears=0
    Update AccountBase 
    Set  IsOverSixYears= Case
     WHEN   ABS(DATEDIFF(DAY,(Select Top (1) Si.SellDate order by Si.SellDate desc),(Select 
     Top(1)app.AppointmentDate order by app.AppointmentDate desc)))< 6*365 
      THEN 1
     WHEN   ABS(DATEDIFF(DAY,(Select Top (1) Si.SellDate),(Select Top(1)app.AppointmentDate)))>= 6*365 
      THEN 0
     END
    FROM [dbo].[AccountBase] acc inner join [dbo].[SoldItems] Si on acc.accountnumber = Si.accountnumber
 inner join Appointments app on acc.AccountId=app.accountId

我认为内部选择有问题,因为这个查询给我的结果就像内部查询忽略了 order by 子句:

Select Si.SellDate,app.AppointmentDate, 
(Select Top (1) Si.SellDate order by Si.SellDate desc) as Latest 
FROM [dbo].[AccountBase] acc inner join [dbo].[SoldItems] Si on acc.accountnumber = Si.accountnumber
       inner join Appointments app on acc.AccountId=app.accountId
       Where Si.accountnumber='V033072'

结果:

SellDate                AppointmentDate         Latest
2006-07-06 00:00:00.000 2017-08-17 09:00:00.000 2006-07-06 00:00:00.000
2006-07-06 00:00:00.000 2017-08-17 09:00:00.000 2006-07-06 00:00:00.000
2011-08-08 00:00:00.000 2017-08-17 09:00:00.000 2011-08-08 00:00:00.000
2017-08-17 00:00:00.000 2017-08-17 09:00:00.000 2017-08-17 00:00:00.000
2011-08-08 00:00:00.000 2017-08-17 09:00:00.000 2011-08-08 00:00:00.000

它与销售日期没有什么不同。

我已经在日期时间字段上尝试过 Max 函数,但它给了我运行时错误:

聚合可能不会出现在 UPDATE 语句的集合列表中。

如何重写这个查询才能正常工作?

感谢您的帮助。

【问题讨论】:

您可能不需要多个嵌套子查询。您将需要包含示例数据以符合您的预期结果。 【参考方案1】:

嗯。 . .您可以使用FROM 子句并聚合before 加入。您想要的逻辑如下所示:

update ab
    set IsOverSixYears = (case when AppointmentDate > dateadd(year, 6, max_SellDate) then 1 else 0 end)
    from AccountBase ab left join
         (select si.accountId, max(si.SelltDate) as max_SellDate
          from Solditems si
          group by accountId
         ) si
         on si.accountId = ab.accountId left join
         (select a.accountId, max(a.AppointmentDate) as max_AppointmentDate
          from Appointments a
          group by accountId
         ) a
         on a.accountId = ab.accountId ;

您的问题没有说明如果缺少日期该怎么办。甚至不知道这 6 年的发展方向,但这假设 sellDate 是较旧的日期。

【讨论】:

在这种情况下,方向可以是双向的。也不能绑定 on a.accountId 部分。也许是我的错。 它很有用,我改变了一些东西并且工作,谢谢。

以上是关于来自两个表的两个最大日期时间值的 Datediff,并根据差异更新第三个表的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:两个日期之间的差异(Cast TimestampType,Datediff)

第四十三章 SQL函数 DATEDIFF

SQL时间处理datediff的问题

两个日期之间的天数(datediff)

SQL查询两个日期的差-datediff函数

SQL是计算两个日期相差多少天数的函数?