MySQL关联表中计算datetime差值并转为天小时格式的实现
嘿,我来帮你搞定这个时间差值格式化的需求!要把delivery_date_to和当前时间的差转换成X days X hour的格式,得根据你使用的数据库类型来调整,下面给你主流数据库的具体实现方案:
MySQL/MariaDB 版本
MySQL里可以用TIMESTAMPDIFF函数分别计算天数和剩余小时数,再用CONCAT拼接成你要的格式。直接整合到你的关联查询里:
SELECT marketplace_orders.entity_id as id, sales_order.delivery_date_to as delivery_date_to, -- 计算并格式化时间差 CONCAT( TIMESTAMPDIFF(DAY, NOW(), sales_order.delivery_date_to), ' days ', TIMESTAMPDIFF(HOUR, NOW(), sales_order.delivery_date_to) % 24, ' hour' ) as time_left FROM marketplace_orders INNER JOIN sales_order ON marketplace_orders.order_id = sales_order.entity_id; -- 替换成你实际的关联字段
补充说明:
- 如果
delivery_date_to早于当前时间,结果会出现负数。要是需要显示绝对值(比如过期的时间也显示正数),可以套一层ABS():
CONCAT( ABS(TIMESTAMPDIFF(DAY, NOW(), sales_order.delivery_date_to)), ' days ', ABS(TIMESTAMPDIFF(HOUR, NOW(), sales_order.delivery_date_to) % 24), ' hour' ) as time_left
- 如果你需要处理单复数(比如
1 day而不是1 days),可以再加IF判断,但看你的示例是统一用复数形式,所以上面的代码就够了。
PostgreSQL 版本
PostgreSQL用AGE()函数计算时间间隔,再用EXTRACT提取天数和小时数:
SELECT marketplace_orders.entity_id as id, sales_order.delivery_date_to as delivery_date_to, CONCAT( EXTRACT(DAY FROM AGE(sales_order.delivery_date_to, CURRENT_TIMESTAMP)), ' days ', EXTRACT(HOUR FROM AGE(sales_order.delivery_date_to, CURRENT_TIMESTAMP)), ' hour' ) as time_left FROM marketplace_orders INNER JOIN sales_order ON marketplace_orders.order_id = sales_order.entity_id; -- 替换实际关联字段
同样,要处理过期时间的负数问题,给EXTRACT的结果套ABS()就行。
SQL Server 版本
SQL Server用DATEDIFF函数来计算差值,逻辑和MySQL类似:
SELECT marketplace_orders.entity_id as id, sales_order.delivery_date_to as delivery_date_to, CONCAT( DATEDIFF(DAY, GETDATE(), sales_order.delivery_date_to), ' days ', DATEDIFF(HOUR, GETDATE(), sales_order.delivery_date_to) % 24, ' hour' ) as time_left FROM marketplace_orders INNER JOIN sales_order ON marketplace_orders.order_id = sales_order.entity_id; -- 替换实际关联字段
处理负数的话同样用ABS()包裹对应的差值计算部分。
记得把代码里的关联条件(marketplace_orders.order_id = sales_order.entity_id)替换成你实际表之间的关联字段哦!
内容的提问来源于stack exchange,提问作者mileven
相关产品推荐
相关产品推荐

