可以改善CASE功能吗?

时间:2020-04-13 11:50:43

标签: mysql sql performance

我正在尝试从数据库中获取一条消息,以查看订单是否按时交付。我在“ CASE”函数中多次重复一段代码。

可以改进/优化吗?

SELECT (CASE 
          WHEN ROUND((UNIX_TIMESTAMP(orders.delivered_at) - UNIX_TIMESTAMP(DATE_ADD(orders.created_at, INTERVAL (order.time) + 25) MINUTE)))/60) > 0 
            THEN CONCAT('Order delivered with ', ROUND((UNIX_TIMESTAMP(orders.delivered_at) - UNIX_TIMESTAMP(DATE_ADD(orders.created_at, INTERVAL (order.time) + 25) MINUTE)))/60), ' minutes delay.') 
          WHEN ROUND((UNIX_TIMESTAMP(orders.delivered_at) - UNIX_TIMESTAMP(DATE_ADD(orders.created_at, INTERVAL (order.time) + 25) MINUTE)))/60) < 0 
            THEN CONCAT('Order delivered ', ABS(ROUND((UNIX_TIMESTAMP(orders.delivered_at) - UNIX_TIMESTAMP(DATE_ADD(orders.created_at, INTERVAL (order.time) + 25) MINUTE)))/60)), ' minutes faster.')
          ELSE 'Order delivered on time.' 
        END ) as message
FROM orders;

这是表模式:

+----------+---------------------+----------------------+----------------+
| order_id | created_at          | delivered_at         | time (minutes) |
+----------+---------------------+----------------------+----------------+
| 1        | 2020-04-13 10:10:00 | 2020-04-13 12:30:00  | 20             |
+----------+---------------------+----------------------+----------------+
| 2        | 2020-04-13 14:20:00 | 2020-04-13 14:50:00  | 30             |
+----------+---------------------+----------------------+----------------+

对于第一笔订单,结果应为“订单延迟了95分钟。” , 而第二个“订单交付速度要快25分钟。”

订单实际交付和应该交付之间的时间差计算如下:orders.delivered_at-(orders.created_at + time + 25)

查询返回正确的数据,但是可以改进吗?为了不重复“ ROUND((UNIX_TIMESTAMP(....)”重复的代码?

1 个答案:

答案 0 :(得分:0)

获取以子查询为别名的分钟数差异,并像这样使用它:

SELECT
  CASE 
    WHEN o.diff > 0 THEN CONCAT('Order delivered with ', o.diff, ' minutes delay.') 
    WHEN o.diff < 0 THEN CONCAT('Order delivered ', ABS(o.diff), ' minutes faster.')
    ELSE 'Order delivered on time.' 
  END as message
FROM (
  SELECT 
    ROUND((UNIX_TIMESTAMP(orders.delivered_at) - UNIX_TIMESTAMP(DATE_ADD(orders.created_at, INTERVAL (orders.time) + 25 MINUTE)))/60)   as diff
  FROM orders
) as o

请参见demo
结果:

| message                                |
| -------------------------------------- |
| Order delivered with 95 minutes delay. |
| Order delivered 25 minutes faster.     |