繁体   English   中英

CASE function 可以改进吗?

[英]Can the CASE function be improved?

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

可以改进/优化吗?

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(....”)重复代码吗?

从子查询中获取别名的分钟差异并像这样使用它:

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

演示
结果:

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

暂无
暂无

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

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