MySql difference between two timestamps in days?

MysqlDatetimeTimestamp

Mysql Problem Overview


How can I get the difference between two timestamps in days? Should I be using a datetime column for this?


I switched my column to datetime. Simple subtraction doesn't seem to give me a result in days.

mysql> SELECT NOW(), last_confirmation_attempt, NOW() - last_confirmation_attempt AS diff  FROM DateClubs HAVING diff IS NOT NULL ;
+---------------------+---------------------------+-----------------+
| NOW()               | last_confirmation_attempt | diff            |
+---------------------+---------------------------+-----------------+
| 2010-03-30 10:52:31 | 2010-03-16 10:41:47       | 14001084.000000 |
+---------------------+---------------------------+-----------------+
1 row in set (0.00 sec)

I don't think diff is in seconds, because when I divide diff by number of seconds in a day ( 86,400 ), I don't get a sensical answer:

mysql> SELECT NOW(), last_confirmation_attempt, ( NOW() - last_confirmation_attempt) / 86400 AS diff  FROM DateClubs HAVING diff IS NOT NULL ;
+---------------------+---------------------------+----------------+
| NOW()               | last_confirmation_attempt | diff           |
+---------------------+---------------------------+----------------+
| 2010-03-30 10:58:58 | 2010-03-16 10:41:47       | 162.0568402778 |
+---------------------+---------------------------+----------------+
1 row in set (0.00 sec)

Mysql Solutions


Solution 1 - Mysql

If you're happy to ignore the time portion in the columns, DATEDIFF() will give you the difference you're looking for in days.

SELECT DATEDIFF('2010-10-08 18:23:13', '2010-09-21 21:40:36') AS days;
+------+
| days |
+------+
|   17 |
+------+

Solution 2 - Mysql

I know is quite old, but I'll say just for the sake of it - I was looking for the same problem and got here, but I needed the difference in days.

I used SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp returns the difference in seconds, and then I just divide into minutes(seconds/60), hours(minutes/60), days(hours/24).

Solution 3 - Mysql

CREATE TABLE t (d1 timestamp, d2 timestamp);

INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 05:00:00');
INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-11 00:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-04-01 13:00:00');

SELECT d2, d1, DATEDIFF(d2, d1) AS diff FROM t;

+---------------------+---------------------+------+
| d2                  | d1                  | diff |
+---------------------+---------------------+------+
| 2010-03-30 05:00:00 | 2010-03-11 12:00:00 |   19 |
| 2010-03-30 13:00:00 | 2010-03-11 12:00:00 |   19 |
| 2010-03-30 13:00:00 | 2010-03-11 00:00:00 |   19 |
| 2010-03-30 13:00:00 | 2010-03-10 12:00:00 |   20 |
| 2010-04-01 13:00:00 | 2010-03-10 12:00:00 |   22 |
+---------------------+---------------------+------+
5 rows in set (0.00 sec)

Solution 4 - Mysql

If you want to return in full TIMESTAMP format than try it: -

 SELECT TIMEDIFF(`call_end_time`, `call_start_time`) as diff from tablename;

return like

     diff
     - - -
    00:05:15

Solution 5 - Mysql

If you need the difference in days accounting up to the second:

SELECT TIMESTAMPDIFF(SECOND,'2010-09-21 21:40:36','2010-10-08 18:23:13')/86400 AS diff

It will return
diff
16.8629

Solution 6 - Mysql

SELECT DATEDIFF( now(), '2013-06-20' );

> here datediff takes two arguments 'upto-date', 'from-date' > > What i have done is, using now() function, i can get no. of days since 20-june-2013 till today.

Solution 7 - Mysql

SELECT DATEDIFF(max_date, min_date) as days from my table. This works even if the col max_date and min_date are in string data types.

Solution 8 - Mysql

Further elaborating upon the answer given by @DanielVassallo and providing an alternate method using TIMESTAMPDIFF() function instead of the DATEDIFF() function used by @DanielVassallo -

CREATE TABLE t (d1 timestamp, d2 timestamp);

INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 05:00:00');
INSERT INTO t VALUES ('2010-03-11 12:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-11 00:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-03-30 13:00:00');
INSERT INTO t VALUES ('2010-03-10 12:00:00', '2010-04-01 13:00:00');

SELECT d1, d2, TIMESTAMPDIFF(DAY, d1, d2) AS diff FROM t;

+---------------------+---------------------+------+
| d1                  | d2                  | diff |
+---------------------+---------------------+------+
| 2010-03-11 12:00:00 | 2010-03-30 05:00:00 |   18 |
| 2010-03-11 12:00:00 | 2010-03-30 13:00:00 |   19 |
| 2010-03-11 00:00:00 | 2010-03-30 13:00:00 |   19 |
| 2010-03-10 12:00:00 | 2010-03-30 13:00:00 |   20 |
| 2010-03-10 12:00:00 | 2010-04-01 13:00:00 |   22 |
+---------------------+---------------------+------+

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser151841View Question on Stackoverflow
Solution 1 - MysqlUncle ArnieView Answer on Stackoverflow
Solution 2 - MysqlEnricoView Answer on Stackoverflow
Solution 3 - MysqlDaniel VassalloView Answer on Stackoverflow
Solution 4 - MysqlKamlesh KumarView Answer on Stackoverflow
Solution 5 - MysqlMakulit A. KoView Answer on Stackoverflow
Solution 6 - MysqlArvind KumarView Answer on Stackoverflow
Solution 7 - MysqlAmit BhatView Answer on Stackoverflow
Solution 8 - MysqlPayel SenapatiView Answer on Stackoverflow