繁体   English   中英

SQL - 如何根据另一列减去一列中的两个 DATE 值?

[英]SQL - How to subtract two DATE values in a column based on another column?

我有一个表格,用于存储货物何时到达和何时离开的数据。 我需要根据 ARRIVAL 列从 IN 日期中减去 OUT 日期,并在单独的表格中显示所有已放置 5 天或更长时间的货物。 如何才能做到这一点?

这是我的桌子-

ID 到达 日期
C1 出去 2022-06-23
C1 2022-06-18
C2 出去 2022-06-20
C2 2022-06-18
C3 出去 2022-06-24
C3 2022-06-17

预期结果 -

逾期发货
C1
C3

测试数据:

create table my_table (id, arrival, date_col) as
  select 'C1', 'OUT', date '2022-06-23' from dual union all
  select 'C1', 'IN' , date '2022-06-18' from dual union all
  select 'C2', 'OUT', date '2022-06-20' from dual union all
  select 'C2', 'IN' , date '2022-06-18' from dual union all
  select 'C3', 'OUT', date '2022-06-24' from dual union all
  select 'C3', 'IN' , date '2022-06-17' from dual union all
  select 'C4', 'IN' , date '2022-05-30' from dual union all
  select 'C5', 'IN' , date '2022-06-20' from dual
;

注意最后两行,对于 id = C4,resp。 C5。 他们只有一个'IN ”行,还没有一个'OUT'行。 在我的回答中,我假设您想要找到没有'OUT'行的那些 id,如果'IN'行当前(截至查询运行时)至少五天前。

date是 Oracle 关键字,不应用作列名。 我将名称更改为date_col 使用您的实际列名,我希望它不是date

查询和输出:

select id
from   my_table
pivot  (min(date_col) for arrival in ('IN' as date_in, 'OUT' as date_out))
where  date_in <= nvl(date_out, sysdate) - 5    --  example run on 2022-06-22
order  by id                                    --  or whatever you need
;

ID
--
C1
C3
C4

pivot操作是聚合操作; 它避免了其他答案中使用的连接,这通常需要读取两次相同的数据。

可以使用“+”计算日期的添加天数。 这样,可以比较日期。

SELECT i.id FROM events i JOIN events o ON i.id = o.id
WHERE i.arrival = 'IN' 
AND o.arrival = 'OUT'
AND o.date >= i.date + 5

在这种情况下: i.date + 5 将 5 天添加到日期。

您需要根据公共 ID 对一个表进行自联接。 但是,我建议做一个 LEFT-JOIN,这意味着我想要从一侧开始,而不管另一侧的条目如何。 所以,总是从一个 INBOUND 项目开始,左连接到一个匹配的 OUTBOUND。 如果没有 OUTBOUND 版本,则根据当前日期计算天数差异。 即:如果今天还没有发货,已经5天了,为什么要等到9天后有人到货才告诉工作人员加急工作,或者找出发生了什么。

select
      InRec.Id,
      datediff( coalesce( OutRec.Date, CurDate() ), InRec.Date ) DaysToShip,
      case when OutRec.Id is null then 'NOT SHIPPED' else '' end status
   from
      YourTable InRec
         LEFT JOIN YourTable OutRec
            on InRec.Id = OutRec.Id
            AND OutRec.Arrival = 'OUT'
   where
          InRec.Arrival = 'IN'
      AND datediff( coalesce( OutRec.Date, CurDate() ), InRec.Date ) >= 5

因此,即使没有特别要求,我也将计算包含在字段列表中,以便您查看具体结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM