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

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

Tento článek se zabývá rozdílem mezi dvěma funkcemi MySQL; DATEDIFF() a TIMESTAMPDIFF() .

Obě funkce vrátí rozdíl mezi dvěma daty a/nebo časy, ale výsledek se mezi těmito dvěma funkcemi liší.

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

DATEDIFF() TIMESTAMPDIFF()
Vyžaduje 2 argumenty. Vyžaduje 3 argumenty.
Odečte 2. argument od 1. (výraz1 − výraz2). Odečte 2. argument od 3. (výraz2 − výraz1).
Výsledek je vyjádřen jako hodnota ve dnech. Výsledek je vyjádřen jako jednotka poskytnutá prvním argumentem.
Může porovnávat pouze hodnotu data svých argumentů. Může porovnat hodnotu data a času svých argumentů.

Příklad 1 – Základní operace

Zde je příklad, který ukazuje, jak tyto funkce fungují a jak se výsledky liší, i když používáte stejnou jednotku.

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

Výsledek:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+

Obě funkce tedy vrátí rozdíl ve dnech, nicméně jeden výsledek je kladný a druhý záporný. Důvodem je DATEDIFF() odečte druhé datum od prvního, zatímco TIMESTAMPDIFF() odečte první datum od druhého.

Příklad 2 – Změna jednotky

Jak ukazuje předchozí příklad, TIMESTAMPDIFF() umožňuje určit jednotku, jakou mají být výsledky vráceny (ve skutečnosti to vyžaduje můžete určit jednotku). Na druhé straně DATEDIFF() neumožňuje určit jednotku. Výsledek vrátí pouze ve dnech.

Takže bychom mohli upravit předchozí příklad tak, že TIMESTAMPDIFF() vrátí počet hodin místo dnů:

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

Výsledek:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |           -24 |
+----------+---------------+

Můžete jít až do mikrosekund:

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

Výsledek:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |  -86400000000 |
+----------+---------------+

Příklad 3 – Přesnost

Přesnost DATEDIFF() je jeden den a TIMESTAMPDIFF() může klesnout na mikrosekundu. Nicméně přesnost TIMESTAMPDIFF() (a jednotka, kterou porovnává) stále závisí na zadané jednotce.

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds',
  TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';

Výsledek:

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|        0 |    0 |    23 |    1439 |   86399 |  86399000000 |
+----------+------+-------+---------+---------+--------------+

A tady je výsledek, pokud zvýšíme 2. datum o jednu sekundu (čímž se přesune na další den):

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds',
  TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';

Výsledek:

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|       -1 |    1 |    24 |    1440 |   86400 |  86400000000 |
+----------+------+-------+---------+---------+--------------+

Zde je další příklad, tentokrát jak to vypadá, když vrátíme měsíce, čtvrtletí a roky, když je rozdíl jeden měsíc (nebo 31 dní):

SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00';
SELECT 
  DATEDIFF(@date1, @date2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Month',
  TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter',
  TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';

Výsledek:

+----------+------+-------+---------+------+
| DATEDIFF | Days | Month | Quarter | Year |
+----------+------+-------+---------+------+
|      -31 |   31 |     1 |       0 |    0 |
+----------+------+-------+---------+------+

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

Obě funkce vrátí hodnotu null, pokud je jim předán nesprávný typ argumentu.

SET @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  DATEDIFF(@time1, @time2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';

Výsledek:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|     NULL |          NULL |
+----------+---------------+

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

Obě funkce umožňují zadat datum jako jeden argument a datum a čas jako další argument.

SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Výsledek:

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+

  1. Odesílejte e-maily s přílohami v Oracle D2k, Oracle Forms 10g, Oracle Forms 6i

  2. Oddělovače v MySQL

  3. Úplný seznam znakových sad podporovaných MariaDB

  4. Jak monitorovat PostgreSQL běžící uvnitř kontejneru Docker:Část první