mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式

/**有一个需求,要求获得两个日期想减的天数,小时数,分钟数。通过查找资料,于是乎我写出了如下代码,来获得两个字段。*/        IFNULL(CONCAT( IF(aib.`forecast_reply_time`-aib.`actual_reply_time` < 0,'-',''),
                IF(FLOOR(HOUR(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`)) / 24)=0,'', CONCAT(FLOOR(HOUR(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`)) / 24),'天')),
                IF(MOD(HOUR(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`)), 24)=0,'',CONCAT(MOD(HOUR(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`)), 24), '小时')),
                IF(MINUTE(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`))=0,'0',CONCAT(MINUTE(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`)), '分钟'))),"") AS stipulatedOften,
              IFNULL(CONCAT( 
                IF(FLOOR(HOUR(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`)) / 24)=0,'', CONCAT(FLOOR(HOUR(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`)) / 24),'天')),
                IF(MOD(HOUR(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`)), 24)=0,'',CONCAT(MOD(HOUR(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`)), 24), '小时')),
                IF(MINUTE(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`))=0,'0',CONCAT(MINUTE(TIMEDIFF(aib.`created_at`,aib.`actual_reply_time`)), '分钟'))),"") AS actualOften,

  

/**后来需求改变,用户觉得现实中文的天,小时,分钟太麻烦了,想要总共的小时数、分钟数,但是mysql的TIMEDIFF的方法,是精确到秒的,但是用户又不想要秒。于是乎我又一次进行了更改,使用到了mysql的LEFT函数和LENGTH函数进行了处理弄成了用户想要的样子*/
IFNULL(LEFT(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`),LENGTH(TIMEDIFF(aib.`forecast_reply_time`,aib.`actual_reply_time`))-3),"") AS stipulatedOften,
IFNULL(LEFT(TIMEDIFF(aib.`actual_reply_time`,aib.`created_at`),LENGTH(TIMEDIFF(aib.`actual_reply_time`,aib.`created_at`))-3),"") AS actualOften,

 

IF 表达式
IF( expr1 , expr2 , expr3 )
expr1 的值为 TRUE,则返回值为 expr2 
expr1 的值为FALSE,则返回值为 expr3
一般我们在使用ifnull()方法的时候,都是类似下面的语句:

IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值

select ifnull(name,'no name') from person;

将查询到的结果中的null转化为指定的字符串,但是其实在where查询部分也可以使用ifnull():

select * from person where ifnull(name,'no name')='no name';

  

 

 

posted @ 2020-12-28 14:13  潇湘客2  阅读(851)  评论(0编辑  收藏  举报