【问题标题】:sql - select case statement to add time cut-offsql - 选择 case 语句以添加时间截止
【发布时间】:2020-12-09 22:02:53
【问题描述】:

我有这张表,其中包含创建的订单时间,以及接收、处理中、分配和交付的时间。以及计算其平均时间的视图。我正在尝试添加一个条款,将晚上 8:00(关闭时间)之后提交的订单作为第二天早上 8:00(营业时间)接收,以保持正确的平均时间。这是订单 [![table: ][1]][1] 这是我用来计算平均时间的视图

SELECT 
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`received_time`,
            `sales`.`inprocess_time`)) AS `avg_prepare`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`inprocess_time`,
            `sales`.`assigned_time`)) AS `avg_assign`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`assigned_time`,
            `sales`.`delivered_time`)) AS `avg_delivery`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`received_time`,
            `sales`.`delivered_time`)) AS `avg_total`
    FROM
        `customer_orders` `sales`

感谢您的帮助!

【问题讨论】:

  • 晚上8点以后提交的订单可以用case语句转换价值,可以加+12小时。请添加实际数据而不是图像。
  • 你所说的数据是指 dbfiddle?
  • 这是最好的,或者您可以简单地粘贴有问题的数据而不是图像。
  • 你希望我将数据直接粘贴到帖子中,还是链接到 Excel?
  • 只要我们可以访问数据进行测试,任何事情都会奏效。

标签: mysql sql time analysis


【解决方案1】:
SELECT 
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`received_time`,
            `sales`.`inprocess_time`)) AS `avg_prepare`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`inprocess_time`,
            `sales`.`assigned_time`)) AS `avg_assign`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`assigned_time`,
            `sales`.`delivered_time`)) AS `avg_delivery`,
        AVG(TIMESTAMPDIFF(MINUTE,
            `sales`.`received_time`,
            `sales`.`delivered_time`)) AS `avg_total`
    FROM
        (SELECT 
              CASE WHEN TIME(received_time) > '20:00:00' THEN DATE_ADD(DATE(received_time), INTERVAL 32 HOUR) 
                   WHEN TIME(received_time) <= '07:59:59' THEN DATE_ADD(DATE(received_time), INTERVAL 8 HOUR) 
                   ELSE received_time 
              END as received_time
           ,inprocess_time
           ,assigned_time
           ,delivered_time
        FROM `customer_orders`
        WHERE created_on between '2020-08-01' AND '2020-09-01'
        ) AS `sales`

【讨论】:

  • 谢谢加布里埃尔!尽管当我尝试添加 where 子句以使其仅在 8 月的订单上运行时,它给了我一个错误?
  • 我已经更新了我的查询。我猜您是在父查询而不是子查询上应用过滤器。您仍然可以在父查询中应用过滤器,但您只能使用子查询中的列。所以你可以像我一样做,或者只是在子查询的选择列表中添加 created_on 列,然后你可以使用它来过滤父查询。
  • 这个查询是不是缺少 CASE 中 00:00 到 07:59 之间收到的订单的一部分?
  • 很好地抓住了 Ivo P。我已经调整了我的查询以涵盖这些情况。
  • WHEN TIME(received_time) &gt; '20:00:00' THEN DATE_ADD(DATE(received_time), INTERVAL 32 HOUR) 这意味着对于晚上 8 点之后的订单,取不带时间的日期并加上 32 小时(一天和 8 小时) - 表示第二天早上 8 点。 WHEN TIME(received_time) &lt;= '07:59:59' THEN DATE_ADD(DATE(received_time), INTERVAL 8 HOUR) 对于早上 8 点之前收到的订单,取不带时间的日期并加上 8 小时 - 即今天上午 8 点。所以我不会按固定的时间移动时间,我会根​​据您的要求将它们设置为第二天早上 8 点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多