【问题标题】:MySql difference between two timestamps in days?MySql 两个时间戳之间的天数差异?
【发布时间】:2011-02-02 12:21:18
【问题描述】:

如何获得两个时间戳之间的天数差异?我应该为此使用日期时间列吗?


我将我的专栏切换到日期时间。简单的减法似乎并没有在几天内给我一个结果。
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)

【问题讨论】:

  • 目前您的列/值是什么数据类型?
  • 我使用的是时间戳,但我只是将一列更改为日期时间。

标签: mysql datetime timestamp


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    如果您愿意忽略列中的时间部分,DATEDIFF() 将在几天内为您提供所需的差异。

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

    【讨论】:

    • 我也在谷歌上搜索如何找到当前日期之间的差异,所以让它在这里:DATEDIFF(CURDATE(), '2015-04-18')
    【解决方案3】:

    我知道它已经很老了,但我会说只是为了它 - 我一直在寻找同样的问题并来到这里,但我需要几天的差异。

    我用SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp 以秒为单位返回差值,然后我只是分为分钟(秒/60)、小时(分钟/60)、天(小时/24)。

    【讨论】:

    • 这能正确处理闰年吗?
    • 是的,因为时间戳处理闰年。时间戳差异以秒为单位返回两个日期之间的差异。如果你划分到一天,你就可以了(每年的每一天都有相同的秒数)。
    • @Enrico - 不正确。根据年份的不同,有些日子会有额外的一秒或两秒。这些发生在 6 月 30 日午夜或 12 月 31 日午夜。它们是闰秒,用于调整平均太阳日秒与原子钟秒之间的偏差。如果您检查 UNIX 和 SQL 计算器,它们将允许 62 秒分钟,这意味着秒值的范围可以从 0 到 61(含)。调整也可以是负的 2 秒,但这从未发生过,因为漂移总是需要正的闰秒。该标准最多允许 2 秒。
    • @Jim 我从来没有处理过这个问题。感谢您的提示!
    • @Enrico - 要考虑的另一件事是在某些民用时间系统中存在 23 小时和 25 小时天。 UTC 从来没有,但北美和欧洲大部分地区(至少)的民用时间系统也有 23 和 25 小时日,只要时钟调整到或从所谓的夏季或夏令时调整。一天 23 或 25 小时的规则可能很复杂。 UNIX 和 SQL 时间系统内置了这一点。UTC 从不观察 23 或 25 小时的一天,但它仍然具有上述的闰秒。
    【解决方案4】:

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

    这里 datediff 有两个参数 'upto-date', 'from-date'

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

    【讨论】:

      【解决方案5】:

      如果你想以完整的 TIMESTAMP 格式返回,那就试试吧:-

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

      返回喜欢

           diff
           - - -
          00:05:15
      

      【讨论】:

        【解决方案6】:

        如果您需要天数差到第二个:

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

        它会返回
        diff
        16.8629

        【讨论】:

          【解决方案7】:

          从我的表中选择 DATEDIFF(max_date, min_date) 作为天数。 即使 col max_datemin_date 是字符串数据类型,这仍然有效。

          【讨论】:

            【解决方案8】:

            进一步阐述@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 |
            +---------------------+---------------------+------+
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-13
              相关资源
              最近更新 更多