【问题标题】:Difference between two dates in MySQLMySQL中两个日期之间的差异
【发布时间】:2011-06-13 03:42:53
【问题描述】:

如何计算两个日期之间的差异,格式为YYYY-MM-DD hh: mm: ss,并以秒或毫秒为单位获得结果?

【问题讨论】:

  • @didxga:当心:(结束 - 开始)不会返回日期时间值之间的秒差。它返回一个数字,该数字是看起来像 yyyymmddhhmmss 的十进制数字之间的差。

标签: mysql sql date datetime


【解决方案1】:
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01');
-- result: 22:00:59, the difference in HH:MM:SS format


SELECT TIMESTAMPDIFF(SECOND,'2007-12-30 12:01:01','2007-12-31 10:02:00'); 
-- result: 79259  the difference in seconds

因此,您可以使用TIMESTAMPDIFF 来达到您的目的。

【讨论】:

  • “以秒为单位的天数之差”究竟是什么意思?我不明白为什么将TIMEDIFF 的结果乘以24*60*60 不等于TIMESTAMPDIFF 的结果。
  • 这个解决方案对我有用!但就我而言,我想在 DAY 执行 TIMESTAMPDIFF,但不考虑周末(周六/周日)。我的意思是,只有工作日的差异......有可能以简单的方式吗?如果没有,我为给您带来的不便深表歉意,然后我将寻找另一种解决方案。传统知识。
  • 示例中的 TIMEDIFF 不正确,因为这不是这两天之间的秒数。 TIMEDIFF 返回一个 TIME 值,该值具有小时、分钟和秒的差异。乘以它不会产生有用的答案。使用 TIMESTAMPDIFF。
  • 有趣的是,TIMEDIFF() 预计开始和结束时间参数的顺序与TIMESTAMPDIFF() 预计的相反。
  • 注意:使用TIMEDIFF功能时,时间值的范围是“-838:59:59”到“838:59:59”。 w3schools.com/SQl/func_mysql_timediff.asp
【解决方案2】:

如果您正在使用 DATE 列(或者可以将它们转换为日期列),请尝试 DATEDIFF(),然后乘以 24 小时 60 分钟 60 秒(因为 DATEDIFF 以天为单位返回差异)。来自 MySQL:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

例如:

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 00:00:00') * 24*60*60

【讨论】:

  • 我认为这行不通。 DATEDIFF 不返回分数。
【解决方案3】:

使用 DATEDIFF 获取以天为单位的日期差异

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

参考以下链接 MySql difference between two timestamps in days?

【讨论】:

  • 亲爱的,它非常适合上述问题,但我想用相同的查询进行一些修改,所以请帮助我如何实现这一点。在这里,我想将最终结果与我的值进行比较,例如 SELECT * FROM table where datediff(today,databasedate) as days =3; 类似的东西
【解决方案4】:
SELECT TIMESTAMPDIFF(HOUR,NOW(),'2013-05-15 10:23:23')
   calculates difference in hour.(for days--> you have to define day replacing hour
SELECT DATEDIFF('2012-2-2','2012-2-1')

SELECT TO_DAYS ('2012-2-2')-TO_DAYS('2012-2-1')

【讨论】:

    【解决方案5】:
    select 
    unix_timestamp('2007-12-30 00:00:00') - 
    unix_timestamp('2007-11-30 00:00:00');
    

    【讨论】:

    • unix_timestamp - 类 Unix 系统中的标准计时方式。表示一个 32 位整数,表示自 01/01/1970 00:00:00 以来经过了多少秒。即下限。上限限制为一年2106,但由于频繁的程序不使用这个值(而不是使用有符号整数来代替无符号整数)被认为是2038年的上限。
    • +过夏令时时被误扣/加
    【解决方案6】:
    SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');
    

    第二种方法

    SELECT ( DATEDIFF('1993-02-20','1993-02-19')*( 24*60*60) )AS 'seccond';

    CURRENT_TIME() --this will return current Date
    DATEDIFF('','') --this function will return  DAYS and in 1 day there are 24hh 60mm 60sec
    

    【讨论】:

      【解决方案7】:

      或者,你可以使用 TIMEDIFF 函数

      mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
      '-00:00:00.000001'
      mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001' , '2008-12-30 01:01:01.000002');
       '46:58:57.999999'
      

      【讨论】:

      • TC 希望以秒或毫秒为单位获取结果值。
      【解决方案8】:

      此函数获取两个日期之间的差异,并以日期格式 yyyy-mm-dd 显示。您只需要执行下面的代码,然后使用该函数。执行后就可以这样使用了

      SELECT datedifference(date1, date2)
      FROM ....
      .
      .
      .
      .
      
      
      DELIMITER $$
      
      CREATE FUNCTION datedifference(date1 DATE, date2 DATE) RETURNS DATE
      NO SQL
      
      BEGIN
          DECLARE dif DATE;
          IF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < 0    THEN
                      SET dif=DATE_FORMAT(
                                              CONCAT(
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                                  '-',
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                                  '-',
                                                  DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(DATE_SUB(date1, INTERVAL 1 MONTH)), '-', DAY(date2))))),
                                              '%Y-%m-%d');
          ELSEIF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < DAY(LAST_DAY(DATE_SUB(date1, INTERVAL 1 MONTH))) THEN
                      SET dif=DATE_FORMAT(
                                              CONCAT(
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                                  '-',
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                                  '-',
                                                  DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                              '%Y-%m-%d');
          ELSE
                      SET dif=DATE_FORMAT(
                                              CONCAT(
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                                  '-',
                                                  PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                                  '-',
                                                  DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                              '%Y-%m-%d');
          END IF;
      
      RETURN dif;
      END $$
      DELIMITER;
      

      【讨论】:

        【解决方案9】:
        select TO_CHAR(TRUNC(SYSDATE)+(to_date( '31-MAY-2012 12:25', 'DD-MON-YYYY HH24:MI') 
                                     - to_date( '31-MAY-2012 10:37', 'DD-MON-YYYY HH24:MI')), 
                'HH24:MI:SS') from dual
        

        --结果:01:48:00

        好吧,这不是 OP 所要求的,但这是我想做的 :-)

        【讨论】:

          【解决方案10】:

          此代码以 yyyy MM dd 格式计算两个日期之间的差异。

          declare @StartDate datetime 
          declare @EndDate datetime
          
          declare @years int
          declare @months int 
          declare @days int
          
          --NOTE: date of birth must be smaller than As on date, 
          --else it could produce wrong results
          set @StartDate = '2013-12-30' --birthdate
          set @EndDate  = Getdate()            --current datetime
          
          --calculate years
          select @years = datediff(year,@StartDate,@EndDate)
          
          --calculate months if it's value is negative then it 
          --indicates after __ months; __ years will be complete
          --To resolve this, we have taken a flag @MonthOverflow...
          declare @monthOverflow int
          select @monthOverflow = case when datediff(month,@StartDate,@EndDate) - 
            ( datediff(year,@StartDate,@EndDate) * 12) <0 then -1 else 1 end
          --decrease year by 1 if months are Overflowed
          select @Years = case when @monthOverflow < 0 then @years-1 else @years end
          select @months =  datediff(month,@StartDate,@EndDate) - (@years * 12) 
          
          --as we do for month overflow criteria for days and hours 
          --& minutes logic will followed same way
          declare @LastdayOfMonth int
          select @LastdayOfMonth =  datepart(d,DATEADD
              (s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)))
          
          select @days = case when @monthOverflow<0 and 
              DAY(@StartDate)> DAY(@EndDate) 
          then @LastdayOfMonth + 
            (datepart(d,@EndDate) - datepart(d,@StartDate) ) - 1  
                else datepart(d,@EndDate) - datepart(d,@StartDate) end 
          
          
          select
           @Months=case when @days < 0 or DAY(@StartDate)> DAY(@EndDate) then @Months-1 else @Months end
          
          Declare @lastdayAsOnDate int;
          set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate),0)));
          Declare @lastdayBirthdate int;
          set @lastdayBirthdate =  datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)));
          
          if (@Days < 0) 
          (
              select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
                  @lastdayBirthdate + @Days
              else
                  @lastdayAsOnDate + @Days
              end
          )
          print  convert(varchar,@years)   + ' year(s),   '  +
                 convert(varchar,@months)  + ' month(s),   ' +
                 convert(varchar,@days)    + ' day(s)   '   
          

          【讨论】:

          • 为什么不简单地使用TIMESTAMPDIFF函数呢?
          【解决方案11】:

          如果您将日期作为字符串存储在文本字段中,您可以实现此代码,它将获取过去一周、一个月或一年排序的天数列表:

          SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 30 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 60 DAY
          
          //This is for a month
          
          SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 7 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 14 DAY
          
          //This is for a week 
          

          %d%m%Y 是你的日期格式

          此查询显示您在此处设置的日期之间的记录,例如:过去 7 天以下和过去 14 天以上,因此您的上周记录将显示与月份或年份相同的概念。无论您在以下日期提供什么值,例如:低于 7 天,所以另一个值将是 14 天的两倍。我们在这里所说的是获取过去 14 天以上和过去 7 天以下的所有记录。这是一个周记录,您可以将值更改为一个月和一年的 30-60 天。

          谢谢你希望它会帮助别人。

          【讨论】:

            【解决方案12】:

            您只需这样做:

            SELECT (end_time - start_time) FROM t; -- return in Millisecond
            SELECT (end_time - start_time)/1000 FROM t; -- return in Second
            

            【讨论】:

            • 当心:(结束 - 开始)不会返回日期时间值之间的秒差。它返回一个数字,该数字是看起来像 yyyymmddhhmmss 的十进制数字之间的差。
            【解决方案13】:

            为什么不直接

            从表中选择 Sum(Date1 - Date2)

            date1 和 date2 是日期时间

            【讨论】:

            • 这不会返回以秒为单位的日期差异,而是返回看起来像 yyyymmddhhmmss 的十进制数字之间的差异。所以,这并不能解决 OP 的问题。对问题的评论中也提到了同样的事情。
            猜你喜欢
            • 2015-11-22
            • 2014-08-22
            • 2012-06-10
            • 2011-10-29
            • 2017-06-13
            • 1970-01-01
            • 2020-10-19
            • 2013-10-02
            • 2012-01-15
            相关资源
            最近更新 更多