有没有办法在 SQL 中找到超过 n 天的最新日期?
Is there a way to find the latest date that is more than n days in SQL?
我正在尝试查找过去 90 天未借入的资产。
逻辑类似于
IF latest date of an asset returned_date > 90 days
more than 90 days
ELIF created_date > 90 days
more than 90 days
ELSE
not more than 90 days
如何将所有这些写入单个查询
贷款
loan_id asset_id returned_date
1 1 2019-12-14 12:00:00.000
2 1 2019-12-10 12:00:00.000
3 2 2020-11-10 12:00:00.000
资产
asset_id created_date
1 2019-12-05 12:00:00.000
2 2019-12-05 12:00:00.000
3 2019-12-05 12:00:00.000
你可以使用CASE
语句和DATEADD
(这里dd
代表天数)来分类哪些是借的或不是(解决方案1).然后,如果您想显示一个或另一个,您可以将条件移动到 WHERE
子句(解决方案 2)。
解决方案 1
select
t1.asset_id,
t2.returned_date,
case when t2.returned_date > dateadd(dd,90,t1.created_date) then 'more than 90 days'
else 'not more than 90 days'
end as 'borrow window'
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
解决方案 2
select t1.*, t2.returned_date
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
where t2.returned_date > dateadd(dd, 90, t1.created_date) -- only > 90
下面的查询returns只查询那些90天内没有借过的资产。
备注:
- 如果资产根本没有被借入,它的创建日期将用于
计算(代码中用**标注)
- 如果一个资产被借过多次,最近一次是
用于计算(代码中用***标示)
select * from(
select
a.asset_id,
l.loan_id,
isnull(l.return_date,a.create_date) as return_date, -- **
rank() over(partition by a.asset_id order by l.return_date desc) as rnk -- ***
from asset a
left join loan l on a.asset_id=l.asset_id
)x
where
rnk=1 -- ***
and datediff(day,return_date, getdate())>=90
如果我没理解错的话,这只是一个not exists
查询。有两个条件:
- 资产至少在 90 天前创建。
- 过去 90 天内没有 returns。
这将是:
select a.*
from asset a
where a.create_date < dateadd(day, -90, getdate()) and
not exists (select 1
from loan l
where l.asset_id = a.asset_id and
l.return_date >= dateadd(day, -90, getdate())
);
我正在尝试查找过去 90 天未借入的资产。 逻辑类似于
IF latest date of an asset returned_date > 90 days
more than 90 days
ELIF created_date > 90 days
more than 90 days
ELSE
not more than 90 days
如何将所有这些写入单个查询
贷款
loan_id asset_id returned_date
1 1 2019-12-14 12:00:00.000
2 1 2019-12-10 12:00:00.000
3 2 2020-11-10 12:00:00.000
资产
asset_id created_date
1 2019-12-05 12:00:00.000
2 2019-12-05 12:00:00.000
3 2019-12-05 12:00:00.000
你可以使用CASE
语句和DATEADD
(这里dd
代表天数)来分类哪些是借的或不是(解决方案1).然后,如果您想显示一个或另一个,您可以将条件移动到 WHERE
子句(解决方案 2)。
解决方案 1
select
t1.asset_id,
t2.returned_date,
case when t2.returned_date > dateadd(dd,90,t1.created_date) then 'more than 90 days'
else 'not more than 90 days'
end as 'borrow window'
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
解决方案 2
select t1.*, t2.returned_date
from asset t1
join loan t2
on t2.asset_id = t1.asset_id
where t2.returned_date > dateadd(dd, 90, t1.created_date) -- only > 90
下面的查询returns只查询那些90天内没有借过的资产。
备注:
- 如果资产根本没有被借入,它的创建日期将用于 计算(代码中用**标注)
- 如果一个资产被借过多次,最近一次是
用于计算(代码中用***标示)
select * from( select a.asset_id, l.loan_id, isnull(l.return_date,a.create_date) as return_date, -- ** rank() over(partition by a.asset_id order by l.return_date desc) as rnk -- *** from asset a left join loan l on a.asset_id=l.asset_id )x where rnk=1 -- *** and datediff(day,return_date, getdate())>=90
如果我没理解错的话,这只是一个not exists
查询。有两个条件:
- 资产至少在 90 天前创建。
- 过去 90 天内没有 returns。
这将是:
select a.*
from asset a
where a.create_date < dateadd(day, -90, getdate()) and
not exists (select 1
from loan l
where l.asset_id = a.asset_id and
l.return_date >= dateadd(day, -90, getdate())
);