sql >> Databáze >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():Jaký je rozdíl?

Tento článek se zabývá rozdílem mezi MySQL TIMEDIFF() a TIMESTAMPDIFF() funkce.

Obě funkce dělají podobnou věc, ale jsou mezi nimi určité významné rozdíly.

Následující tabulka shrnuje rozdíl mezi těmito dvěma funkcemi:

TIMEDIFF() TIMESTAMPDIFF()
Vyžaduje 2 argumenty. Vyžaduje 3 argumenty.
Odečte 2. argument od 1. (datum1 − datum2). Odečte 2. argument od 3. (datum2 − datum1).
Výsledek je vyjádřen jako časová hodnota (a má omezení typu časových dat). Výsledek je celé číslo vyjádřené počtem jednotek podle prvního argumentu.
Přijímá výrazy času nebo data a času. Přijímá výrazy datum nebo datum a čas.
Oba argumenty musí být stejného typu (buď čas nebo datum a čas). Oba argumenty mohou být různého typu (datum nebo datum a čas).

Příklad 1 – Základní rozdíl

Zde je příklad, který ukazuje základní rozdíl mezi těmito funkcemi.

SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';

Výsledek:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Takže vidíme, že TIMEEDIFF() vrátil hodnotu času a TIMESTAMPDIFF() vrátil celé číslo.

Také TIMEEDIFF() odečetl 2. datum od 1., zatímco TIMESTAMPDIFF() odečteno 1. datum od 2.

Příklad 2 – Změna jednotky

Jak již bylo zmíněno, TIMESTAMPDIFF() nám umožňuje určit, ve které jednotce má být výsledek reprezentován. Zde je několik příkladů:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';

Výsledek:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Pokud však použijeme jednotku, která je větší než skutečný časový rozdíl, stane se toto:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';

Výsledek:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

V tomto případě nebyl časový rozdíl dostatečně velký, aby ovlivnil hodnoty týdne nebo měsíce.

Příklad 3 – Nesprávné typy argumentů

Zde je příklad toho, co se stane, když každé funkci předáte nesprávné typy argumentů.

SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';

Výsledek:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

TIMEDIFF() nepodporuje datový typ ‚date‘, a proto vrací 00:00:00 .

A TIMESTAMPDIFF() funkce nepodporuje datový typ „čas“, takže vrací NULL .

Příklad 4 – Smíšené typy argumentů

Zde je to, co se stane, když každé funkci poskytnete dva různé datové typy.

SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Výsledek:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Takže vidíme, že TIMESTAMPDIFF() dobře zvládá smíšené datové typy (pokud se jedná o datum nebo datum a čas).

Nicméně TIMEDIFF() vyžaduje, aby oba argumenty byly stejného typu, takže dostaneme NULL , i když oba argumenty jsou typu, který funkce podporuje (čas a datum a čas).

Že jsou oba typy touto funkcí ve skutečnosti podporovány, můžeme potvrdit na následujícím příkladu:

SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime1, @thetime2) AS 'time',
  TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';

Výsledek:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

Takže je to v pořádku, pokud jsou oba argumenty stejného typu (hodnoty času nebo data a času).


  1. Funkce NULLIF() v Oracle

  2. Know-How k obnovení smazaných záznamů v SQL Server

  3. Funkce LEN nezahrnuje koncové mezery v SQL Server

  4. Po připojení k databázi přepněte roli