MySql两个时间戳之间的天数差异?

55

我该如何计算两个时间戳之间的天数差?我需要使用datetime列吗?


我将列转换为datetime格式,但是简单的相减似乎不能给出天数差。

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)

我认为diff不是以秒为单位的,因为当我将diff除以一天中的秒数(86,400),结果并不合理:

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)

你的列/值目前是什么数据类型? - Andy Shellam
我之前使用的是时间戳,但现在我将其中一列改为了日期时间格式。 - user151841
8个回答

114

如果您愿意忽略列中的时间部分,DATEDIFF() 可以给出您所需的日期差。

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

8
我也在谷歌上搜索如何查找当前日期与另一日期之间的差异,这里提供一个方法: DATEDIFF(CURDATE(), '2015-04-18') - ivkremer

13

我知道这已经有些过时了,但为了说明问题 - 我也遇到了同样的问题并来到这里,但我需要计算日期之间的天数。

我使用了SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp返回的是秒数差值,然后我只需将其转换为分钟(秒数/60),小时(分钟数/60),天数(小时数/24)。


这个程序能正确处理闰年吗? - user151841
1
是的,因为时间戳处理了闰年。时间戳差返回两个日期之间的秒数差。如果你一直除到天,那就没问题了(每年的每一天都有相同数量的秒)。 - Enrico
1
@Enrico - 这不是真的。有些日子会因为年份而多出一秒或两秒。这些发生在6月30日午夜或12月31日午夜。它们是闰秒,用于调整平均太阳日秒与原子钟秒之间的漂移。如果您查看UNIX和SQL计算器,它们将允许62秒的分钟,这意味着秒值可以从0到61(含)范围内。调整也可以为负2秒,但由于漂移总是朝向需要正闰秒的方向,因此从未发生过。标准允许最多2秒的调整。 - Jim
@Jim 我从来没有遇到过这种情况。谢谢你的提示! - Enrico
@Enrico - 另一个需要考虑的问题是某些民用时间系统中存在23和25小时的情况。UTC从来没有这种情况,但北美和大多数欧洲(至少)的民用时间系统在时钟调整到或从所谓的夏令时或日光节约时间时也会出现23和25小时的情况。23或25小时的发生规则可能很复杂。UNIX和SQL时间系统已经内置了这个功能。UTC从未观察过23或25小时的一天,但它仍然有前面提到的闰秒。 - Jim

7
如果您想完整返回时间戳格式,请尝试以下方法: -
 SELECT TIMEDIFF(`call_end_time`, `call_start_time`) as diff from tablename;

返回类似于

     diff
     - - -
    00:05:15

7
如果你需要精确到秒的天数差异:
SELECT TIMESTAMPDIFF(SECOND,'2010-09-21 21:40:36','2010-10-08 18:23:13')/86400 AS diff

它将返回
diff
16.8629


7
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)

3

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

这里DATEDIFF函数有两个参数:截止日期和起始日期。

我所做的是使用now()函数,可以获取从2013年6月20日至今的天数。


0
进一步阐述@DanielVassallo所给答案,并提供一种替代方法,使用TIMESTAMPDIFF()函数而不是@DanielVassallo所使用的DATEDIFF()函数 -
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 |
+---------------------+---------------------+------+

0

从我的表中选择DATEDIFF(max_date, min_date)作为天数。 即使列max_datemin_date是字符串数据类型,这也可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接