MySQLの2つの日付の違い


173

2つの日付の差をフォーマットで計算しYYYY-MM-DD hh: mm: ss、結果を秒またはミリ秒で取得する方法は?


14
@didxga:注意:(終了-開始)は、日時値間の秒差を返しません。yyyymmddhhmmssのような10進数の差である数値を返します。
helloPiers 2015

回答:


329
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あなたの目的のために使うことができます。


2
「日数の秒数の違い」は正確にはどういう意味ですか?TIMEDIFFby の結果を乗算するとの結果と24*60*60等しくない理由がわかりませんTIMESTAMPDIFF
David Tuite 2013年

この解決策は私にとってうまくいきました!しかし、私の場合は、DAYにTIMESTAMPDIFFを実行しますが、週末(土/日)は考慮しません。つまり、平日の違いだけ...それは簡単な方法で可能ですか?そうでない場合は、ご不便をおかけして申し訳ありません。別の解決策を探します。TK。
マッサ

8
例のTIMEDIFFは、これらの2日間の秒数ではないため、正しくありません。TIMEDIFFは、時、分、秒の差があるTIME値を返します。それを乗算しても、有用な答えは得られません。TIMESTAMPDIFFを使用します。
IvanD

4
興味深いのTIMEDIFF()は、開始時刻と終了時刻の引数がで期待されるものとは逆の順序であることを期待することTIMESTAMPDIFF()です。
LS

1
注:TIMEDIFF関数を使用する場合、時間値の範囲は「-838:59:59」から「838:59:59」です。 w3schools.com/SQl/func_mysql_timediff.asp
cREcker

38

DATE列を使用している(またはそれらを日付列としてキャストできる)場合は、DATEDIFF()を試してから、24時間60分60秒を乗算します(DATEDIFFはdiffを日数で返すため)。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

5
私はこの仕事を考えていません。DATEDIFF分数は返しません。
ファンカルロスオロペサ

29

DATEDIFFを使用して日数で日差を取得する

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

または

以下のリンクMySqlの2つのタイムスタンプの日数の違いを参照してください


親愛なる、上記の質問に最適ですが、同じクエリでいくつかの変更が必要なので、どうすればそれを達成できるかを教えてください。ここで私が好き、私の値と最終結果を比較したいSELECT * FROM table where datediff(today,databasedate) as days =3;。このような何か
Soorajアッバースィー

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

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

3
unix_timestamp-Unixライクなシステムでの標準的なタイミング方法。1970年1月1日00:00:00から経過した秒数を示す32ビット整数を表します。つまり下限です。上限は年間2,106に制限されていますが、プログラムが頻繁に実行されるため、この値では動作しません(符号付き整数を使用した符号なし整数の代わりに)は、2038
Devid G

+ DSTを通過すると、誤って差し引かれる/追加される
Devid G

1
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

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'

TCは、秒またはミリ秒単位で結果値を取得したいと考えています。
デビッドG

0

この関数は、2つの日付の差を取り、日付形式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

-結果:01:48:00

OK、それはOPが要求したものではありませんが、私がやりたかったことです:-)


0

このコードは、2つの日付の差を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関数を使用しないのはなぜですか?
codeforester 2018年

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日間のそれ以下のすべてのレコードを取得します。これは、1か月および30から60日に値を変更できる週レコードです。

それが誰かを助けることを願ってありがとう。


-1

あなたは単にこれを行うでしょう:

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

5
注意:(終了-開始)は、日時値間の秒差を返しません。yyyymmddhhmmssのような10進数の差である数値を返します。
helloPiers 2015

-1

なぜか

テーブルからSum(Da​​te1-Date2)を選択します

date1とdate2は日時です


これは日付の違いを秒単位ではなく、yyyymmddhhmmssのような10進数の違いを返します。したがって、これはOPの質問を解決しません。質問のコメントにも同じことが記載されています。
codeforester 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.