【问题标题】:Is there a way to find the latest date that is more than n days in SQL?有没有办法在SQL中找到超过n天的最新日期?
【发布时间】:2021-03-24 02:56:36
【问题描述】:

我正在尝试查找过去 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

【问题讨论】:

  • 感谢大家的帮助!真的很感激。我找到了解决此查询的另一种方法,即查找过去 90 天内借入的资产。然后从原始资产表中减去它。

标签: sql sql-server datetime join case


【解决方案1】:

如果我理解正确,这只是一个not exists 查询。有两个条件:

  • 资产至少在 90 天前创建。
  • 过去 90 天内没有退货。

这将是:

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())
                 );

【讨论】:

    【解决方案2】:

    以下查询仅返回那些 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
    

    【讨论】:

      【解决方案3】:

      您可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 2011-05-03
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        相关资源
        最近更新 更多