2011-01-21 41 views
112

两个日期之间的差异如何计算差值两个日期之间,格式为YYYY-MM-DD hh: mm: ss,并在数秒或毫秒的结果值?在MySQL

+11

@didxga:当心:(结束 - 开始)没有返回的日期时间值之间的差异秒。它返回的数字是十进制数字之间的差异,看起来像yyyymmddhhmmss。 – helloPiers 2015-04-18 08:15:18

回答

215
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01'); 
-- result: 22:00:59. 


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

不错!TIMESTAMPDIFF完美运作!谢谢! – GeoGo 2011-01-21 16:16:39

+1

“几秒钟内的差异”是什么意思?我不明白为什么用'24 * 60 * 60'乘以'TIMEDIFF'的结果不等于'TIMESTAMPDIFF`的结果。 – 2013-10-22 09:12:26

+0

此解决方案适合我!但就我而言,我想在DAY中执行TIMESTAMPDIFF,但不考虑周末(sat/sun)。我的意思是,只有一周的时间不同......这是否有可能以一种简单的方式?如果没有,我为此带来的不便表示歉意,然后我会寻找其他解决方案。 TKS。 – Massa 2015-03-09 13:02:37

32

如果您正在使用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 
+1

我不认为这项工作。 `DATEDIFF`不返回分数。 – 2016-08-18 15:58:18

0

或者,你可以使用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' 
+0

TC希望以秒或毫秒为单位获得结果值。 – 2011-01-21 15:41:08

4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00'); 
0

该函数有两个日期之间的差并显示它在一个日期格式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; 
0
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 

- 结果:1点48分00秒

确定它并不完全是什么OP问,但它是我想要的做:-)

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

只需将做到这一点:

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

在年月日格式两个日期之间的这段代码计算的差异。

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

为什么不

SELECT SUM(日期1 - 日期2)从表

日期1和date2是日期时间

0

如果你存储在文本字段中日期字符串即可执行此代码它将获取过去一天,一个月或一年的天数列表:

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天,也可以更改一年。

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

0
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