我正在尝试从数据库中获取一条消息,以查看订单是否按时交付。我在“ 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(....)”重复的代码?
答案 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. |