Mysql 两个日期字段相减得到秒

昨天下午调试系统日志,看到个报表卡了。
用户反馈平均回复时长不对。
我这瞅了一眼,数据表里存着接单时间和完成时间。
两个时间点,得算算差多少小时啊。
顺手敲了句SQL,用完时间减去接单时间,直接除以3 6 00转成小时。
结果报出来,哇塞,得有5 0个小时那么长。
我这心里咯噔一下,得,数据量太大了。
再想想,能不能不用除法,直接算毫秒差,再除以3 6 00000。
嘿,还真省事。
再看看时间格式,带毫秒的有时候挺烦人的,不如去掉毫秒,直接显示到分。
这么一弄,报表跑得快了,数字也整齐了。
用户那边反馈说现在看着顺眼多了。
等等,还有个事,这毫秒数是怎么来的?难道数据库默认就存到毫秒了?我这得再查查表结构。

mysql两个timestamp格式时间直接相减问题

说实话,MySQL里算时间差这事儿挺容易搞错的。
很多人直接用减法-,比如2 01 8 /01 /2 6 1 1 :1 7 :07 减去2 01 8 /01 /2 6 1 0:3 3 :3 8 ,结果居然是8 3 6 9 这数字看着挺吓人,其实不是2 6 09 秒那么简单。
当时我也没想明白为啥会这么离谱,后来才知道MySQL把时间字符串当数字算了。

真正要算时间差,就得用TIMESTAMPDIFF函数。
你看上面那俩时间,用这个函数算,秒数正好是2 6 09 秒。
这函数贼好用,不管你要秒、分钟、小时、天、周还是月,它都能给你算准。
比如要算差多少分钟,就指定单位是MINUTE,结果就是4 3 分钟。

直接用-运算符确实不靠谱。
我上次碰见个客户,他写了个查询,直接用减法算两个时间戳,结果全错。
一查才知道,他以为-就是算时间差,根本不知道还有TIMESTAMPDIFF这好东西。

所以啊,以后算时间差,别瞎用减法。
用TIMESTAMPDIFF准得多。
这事儿虽然简单,但真容易忘。

mysql:两个时间相减,得出这种格式的时间 '2年240天17小时56分2秒'能用sql写出来吗 ?

这段SQL代码是计算两个日期之间的时间差,然后把时间差拆分成年、天、时、分、秒,最后用字符串链接的方式把结果拼接起来。
下面是修改后的代码,让它能正确运行:
sql DECLARE @str INT SET @str = DATEDIFF(SECOND, '2 01 6 -01 -01 ', '2 01 7 -08 -01 08 :1 2 :3 0')
-
年 SELECT CAST(@str / (8 6 4 00 3 6 5 ) AS CHAR) + '年'
-
天 SELECT CAST(@str / 8 6 4 00 % 3 6 5 AS CHAR) + '天'
-
时 SELECT CAST(@str / 3 6 00 % 2 4 AS CHAR) + '时'
-
分 SELECT CAST(@str / 6 0 % 6 0 AS CHAR) + '分'
-
秒 SELECT CAST(@str % 6 0 AS CHAR) + '秒'
这样修改后,每个时间单位都能正确计算并拼接成字符串。
比如,'2 01 6 -01 -01 ' 到 '2 01 7 -08 -01 08 :1 2 :3 0' 的时间差是 4 3 8 5 天,拆分后就是 1 年 4 3 8 5 天。

说实话,我当时也没想明白为啥要分开选,但这样看确实清晰。
直接全拼在一起也可以,不过这样看每部分怎么算的更明白。

戳实现两个时间戳相减获取时间间隔的MySQL方法mysql中两个时间

上周有个客人问我如何在MySQL中计算两个时间戳之间的时间间隔,这让我想起了之前自己踩过的坑。
其实,MySQL提供了两种方法来解决这个问题。

首先,我们来看看方法一,使用TIMESTAMPDIFF()函数。
这个函数超级实用,可以直接计算出两个时间戳之间的秒数、分钟数、小时数、天数、周数、月数或年数。
比如,你想知道从2 01 9 年1 0月1 日1 0点到1 1 点半之间隔了多久,可以这样写:
sql SELECT TIMESTAMPDIFF(SECOND, '2 01 9 -1 0-01 1 0:00:00', '2 01 9 -1 0-01 1 1 :3 0:00');
这个查询会返回5 4 00,也就是说这两个时间戳之间隔了5 4 00秒。

但如果客人需要的是小时数,那我们就可以用同样的函数,只是单位换一下:
sql SELECT TIMESTAMPDIFF(HOUR, '2 01 9 -1 0-01 1 0:00:00', '2 01 9 -1 0-01 1 1 :3 0:00');
这次查询会返回1 ,因为只隔了一个小时。

接下来,我们来看看方法二,使用UNIX_TIMESTAMP()函数。
这个函数会把日期时间值转换成自1 9 7 0年1 月1 日以来的秒数。
计算两个时间戳之间的差值,然后除以3 6 00(因为一小时有3 6 00秒),就能得到小时数。
比如说:
sql SELECT (UNIX_TIMESTAMP('2 01 9 -1 0-01 1 1 :3 0:00')
UNIX_TIMESTAMP('2 01 9 -1 0-01 1 0:00:00')) / 3 6 00;
这个查询同样会返回1 ,因为两个时间戳之间隔了一个小时。

两种方法各有千秋,具体用哪个取决于你的需求。
如果你需要的是精确到秒的时间差,那就用TIMESTAMPDIFF();如果你只需要知道小时数,那UNIX_TIMESTAMP()可能更方便。
反正你看着办,这两种方法都很实用。
我还在想这个问题,如果你有更好的方法,也欢迎分享哦!