【问题标题】:Subtract 2 different dates with different criteria in SQL Server在 SQL Server 中减去 2 个具有不同条件的不同日期
【发布时间】:2022-01-12 14:59:48
【问题描述】:

我有一个基于下表的问题 -

Cancel Product ID Inception Date Timestamp
No 120 12/08/2020 02/02/2018
No 120 12/06/2016 10/02/2016
No 120 12/02/2017 15/01/2021
Yes 120 12/02/2021 03/03/2021

我想从 2 个不同的列中减去日期 - 最小起始日期,即 12/06/2016 和时间戳,其中取消标志为是,即 03/03/2021 以获得天数。

所以,12/06/2016 - 03/03/3021。

我怎样才能做到这一点?

谢谢!

编辑:上表只是一个 sn-p,我在原始表中有更多行 - 超过 3000 行。

【问题讨论】:

    标签: sql sql-server sybase


    【解决方案1】:

    如果我对问题的理解正确,可以选择以下语句:

    SELECT
       ProductID,
       MIN(InceptionDate) AS InceptionDate,
       MAX(CASE WHEN Cancel = 'Yes' THEN [Timestamp] END) AS [Timestamp],
       DATEDIFF(
         day, 
         MIN(InceptionDate), 
         MAX(CASE WHEN Cancel = 'Yes' THEN [Timestamp] END)
       ) AS Difference
    FROM (VALUES
       ('No',  120, '2020-08-12', '2018-02-02'),
       ('No',  120, '2016-06-12', '2016-02-10'),
       ('No',  120, '2017-02-12', '2021-01-15'),
       ('Yes', 120, '2021-02-12', '2021-03-03')
    ) v (Cancel, ProductID, InceptionDate, [Timestamp])
    GROUP BY ProductID
    

    结果:

    ProductID InceptionDate Timestamp Difference
    120 2016-06-12 2021-03-03 1725

    【讨论】:

    • @Zhorov- 谢谢你的回答。上表将有更多的行,以千 tbh 为单位。
    • @BrawlX 这些行的实际值是多少?表格中是否有不止一行 Cancel=YesProductID
    • 该表只有一行,Cancel = Yes per ProductID。
    • 我还想在输出中添加产品 ID。但是,当我尝试添加它时,值正在发生变化。
    • @BrawlX,这是一个简单的分组和条件聚合。答案已更新。
    【解决方案2】:

    试试这个。

       with cte AS (
    select *,           
           MIN(InceptionDate) OVER(PARTITION BY ProductID) AS MinInceptionDate
    from product
    )
    SELECT *,
           DATEDIFF(dd, MinInceptionDate, timestamp) AS Diff
    FROM cte 
    WHERE cancel = 'Yes'
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多