【问题标题】:Count days between dates in two rows based on condition根据条件计算两行日期之间的天数
【发布时间】:2016-06-27 11:41:17
【问题描述】:

我正在编写必须选择一些信息的查询。下表:

ID  ID-Toner    Quantity    Location    Order_date  Send_date
1     2            1           55       20.01.2015  26.01.2015
2     2            1           41       22.02.2015  26.02.2015
3     2            1           35       23.02.2015  26.02.2015
4     5            1           77       25.02.2015  25.02.2015
5     2            1           55       25.02.2015  26.02.2015

我需要选择所有列和附加列,其中包含两个日期之间的天数:Order_date 和以前的 Order_date,位置 = 即:55。 示例结果应如下所示:

ID  ID-Toner Quantity Location  Order_date  Send_date  Number_of_days
 1     2         1       55     20.01.2015  26.01.2015       0
 5     2         1       55     25.02.2015  26.02.2015       36

如何选择这样的查询?

【问题讨论】:

  • 添加预期结果。
  • 标记使用的 dbms。 (在日期/时间方面,许多产品远不符合 ANSI SQL。)
  • 如果不知道您的数据库,我们无法回答这个问题。

标签: sql hsqldb


【解决方案1】:

在采购订单中澄清后更新

假设它需要对数据进行一种称为排名的聚合,这是一种基于连续排序 tbale 行的编号的分类。

在我们的例子中,订单由订单日期给出。

这是一个非常跨 dbms 的解决方案(日期字段被设置为 Datetime 类型,而 DATEDIFF 是 MySql 的一个函数)所以我认为您可以很容易地适应您的 dbms。

你可以在http://sqlfiddle.com/#!9/290e9http://sqlfiddle.com/#!9/290e9上试用 Sql Fiddle 上的 sql

表格

CREATE TABLE Orders
    (`ID` int, `IDToner` int, `Quantity` int, `Location` int, `Order_date` Date, `Send_date` Date)
;

INSERT INTO Orders
    (`ID`, `IDToner`, `Quantity`, `Location`, `Order_date`, `Send_date`)
VALUES
    (1, 2, 1, 55, STR_TO_DATE('20.01.2015','%d.%m.%Y'), STR_TO_DATE('26.01.2015','%d.%m.%Y')),
    (2, 2, 1, 41, STR_TO_DATE('22.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')),
    (3, 2, 1, 35, STR_TO_DATE('23.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')),
    (4, 5, 1, 77, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('25.02.2015','%d.%m.%Y')),
    (5, 5, 1, 77, STR_TO_DATE('25.04.2015','%d.%m.%Y'), STR_TO_DATE('25.04.2015','%d.%m.%Y')),
    (6, 5, 1, 77, STR_TO_DATE('25.06.2015','%d.%m.%Y'), STR_TO_DATE('25.06.2015','%d.%m.%Y')),
    (7, 5, 1, 77, STR_TO_DATE('25.08.2015','%d.%m.%Y'), STR_TO_DATE('25.08.2015','%d.%m.%Y')),
    (8, 2, 1, 55, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y'))
;


查询

SELECT 
        ID,
        ID_Toner,
        Quantity,
        Location, 
        Order_date, 
        Send_date,        
        days_from_previous_order
FROM(
  SELECT 
        current_ID AS ID,
        current_IDToner AS ID_Toner,
        current_Quantity AS Quantity,
        current_Location AS Location, 
        current_Send_Date AS Send_date,        
        current_Order_Date AS Order_date, 
        previous_Order_Date,
        COALESCE(DATEDIFF(current_Order_Date, previous_Order_Date),0) AS days_from_previous_order
  FROM(
        SELECT 
              TabOrdersRanking_currents.ID AS current_ID,
              TabOrdersRanking_currents.IDToner AS current_IDToner,
              TabOrdersRanking_currents.Quantity AS current_Quantity,
              TabOrdersRanking_currents.Location AS current_Location, 
              TabOrdersRanking_currents.Send_Date AS current_Send_Date,        
              TabOrdersRanking_currents.Order_Date AS current_Order_Date, 
              TabOrdersRanking_previous.Order_Date AS previous_Order_Date 
        FROM(
          SELECT Orders.*, @rank1 := @rank1 + 1 rank
          FROM Orders 
          ,(Select @rank1 := 0) r1   
          order by location, order_date
        ) TabOrdersRanking_currents
        LEFT JOIN( 
          SELECT Orders.*, @rank2 := @rank2 + 1 rank
          FROM Orders 
          ,(Select @rank2 := 0) r2   
          order by location, order_date
        ) TabOrdersRanking_previous
        on TabOrdersRanking_currents.Location = TabOrdersRanking_previous.Location 
        and TabOrdersRanking_currents.rank - TabOrdersRanking_previous.rank = 1      
  ) TabOrdersSuccessionRanking
) TabWithDaysFromPrevious;

【讨论】:

  • 几乎可以工作,'lastdate' 列应显示当前位置订单的日期,而不是最新位置日期。很难解释。示例:我订购了产品 2015-02-10,之前的订单是 2015-01-1。 “天”列应显示这两个日期之间的差异,而不是最新的订单日期和之前的日期。
  • 如果我理解你只是在 lastdate 上添加一个 where 原因过滤
  • 不完全是,在“lastdate”列中显示的是最新日期而不是该记录的订购日期
  • 好的,你想要一个输出,就像你在更新后在问题中显示的那样。我在之后看到它
  • 另外我忘了添加“天”列应该显示适当的差异(记录的订单日期和之前的订单日期)
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2019-09-27
相关资源
最近更新 更多