来自两个表的两个最大日期时间值的 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,并根据差异更新第三个表的主要内容,如果未能解决你的问题,请参考以下文章