假设我有下表test
,它有列id
、time
、post
和这是它所拥有的数据的示例。
-----------------------------------
id time post
-----------------------------------
1 2018-06-17 16:12:30 post1
2 2018-06-17 16:13:09 post2
3 2017-06-15 16:12:30 post7
----------------------------------
我想仅使用 SQL
打印出自每个帖子添加到数据库以来的天数、小时数、分钟数和秒数
好的,这是我的第一次尝试
SELECT
id,
time,
NOW(),
CONCAT (
FLOOR(TIME_FORMAT(SEC_TO_TIME(NOW() - `time`), '%H') / 24),
' Days ',
MOD (TIME_FORMAT(SEC_TO_TIME(NOW() - `time`), '%H'), 24),
' Hours ',
TIME_FORMAT(SEC_TO_TIME(NOW() - `time`), '%i Minutes %s Seconds'),
' ago'
) AS `ago`
FROM
`test`;
但它似乎没有给出正确的计算,例如上面示例的输出是
1 2018-06-17 16:12:30 2018-06-17 20:38:08 0 Days 11 Hours 49 Minutes 38 Seconds ago
2 2018-06-17 16:13:09 2018-06-17 20:38:08 0 Days 11 Hours 48 Minutes 19 Seconds ago
3 2017-06-15 16:12:30 2018-06-17 20:38:08 34 Days 22 Hours 59 Minutes 59 Seconds ago
如您所见,在 id = 3
中,打印输出时的差异应该不仅仅是 34
天
那么代码有什么问题吗? 〜谢谢你
最佳答案
您可以尝试此查询。通过TIMESTAMPDIFF
和TIMESTAMPADD
函数计算间隔。
SELECT
id,
time,
NOW(),
CONCAT (
TIMESTAMPDIFF(DAY,`time`, NOW()),' Days ',
TIMESTAMPDIFF(HOUR, TIMESTAMPADD(DAY, TIMESTAMPDIFF(DAY, `time`, NOW()), `time`), NOW()),' Hours ',
TIMESTAMPDIFF(MINUTE, TIMESTAMPADD(HOUR, TIMESTAMPDIFF(HOUR, `time`, NOW()), `time`), NOW()), ' Minutes ',
TIMESTAMPDIFF(SECOND, TIMESTAMPADD(MINUTE, TIMESTAMPDIFF(MINUTE, `time`, NOW()), `time`), NOW()), ' Seconds '
' ago' ) AS `ago`
FROM
`test`;
sqlfiddle:http://sqlfiddle.com/#!9/5e8085/2
注意
例如,您想要获取 SECOND
上的 Interval
让我们一步一步来了解一下:
1.TIMESTAMPDIFF(MINUTE, time, NOW())
获取 time
和 NOW() 之间的间隔
MINUTE
2.TIMESTAMPADD(MINUTE, TIMESTAMPDIFF(MINUTE, time, NOW()), time)
将 Interval MINUTE
附加到 time
,让他们只有秒
的间隔时间。
3.计算秒间隔。
关于mysql - 使用sql计算之前的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50899519/