Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL DATEDIFF () so với TIMESTAMPDIFF ():Sự khác biệt là gì?

Bài viết này xem xét sự khác biệt giữa hai hàm MySQL; DATEDIFF()TIMESTAMPDIFF() .

Cả hai hàm đều trả về sự khác biệt giữa hai ngày và / hoặc giờ, nhưng kết quả là khác nhau giữa hai hàm.

Bảng sau đây tóm tắt sự khác biệt giữa hai chức năng này:

DATEDIFF() TIMESTAMPDIFF()
Yêu cầu 2 đối số. Yêu cầu 3 đối số.
Trừ đối số thứ 2 khỏi đối số thứ nhất (expr1 - expr2). Trừ đối số thứ 2 khỏi đối số thứ 3 (expr2 - expr1).
Kết quả được biểu thị dưới dạng giá trị tính bằng ngày. Kết quả được biểu thị dưới dạng đơn vị được cung cấp bởi đối số đầu tiên.
Chỉ có thể so sánh giá trị ngày tháng của các đối số của nó. Có thể so sánh giá trị ngày và giờ của các đối số của nó.

Ví dụ 1 - Thao tác cơ bản

Dưới đây là một ví dụ minh họa cách các hàm này hoạt động và kết quả khác nhau như thế nào, ngay cả khi sử dụng cùng một đơn vị.

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';

Kết quả:

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

Vì vậy, cả hai hàm đều trả về sự khác biệt theo ngày, tuy nhiên một kết quả là dương và kết quả còn lại là tiêu cực. Điều này là do DATEDIFF() trừ ngày thứ hai từ ngày đầu tiên, trong khi TIMESTAMPDIFF() trừ ngày đầu tiên cho ngày thứ hai.

Ví dụ 2 - Thay đổi Đơn vị

Như ví dụ trước minh họa, TIMESTAMPDIFF() cho phép bạn chỉ định một đơn vị để trả về kết quả là (trên thực tế, nó yêu cầu bạn để chỉ định đơn vị). Mặt khác, DATEDIFF() không cho phép bạn chỉ định một đơn vị. Nó chỉ trả về kết quả sau vài ngày.

Vì vậy, chúng tôi có thể sửa đổi ví dụ trước để TIMESTAMPDIFF() trả về số giờ thay vì ngày:

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';

Kết quả:

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

Bạn có thể đi đến từng micro giây:

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';

Kết quả:

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

Ví dụ 3 - Độ chính xác

Độ chính xác của DATEDIFF() là một ngày và TIMESTAMPDIFF() có thể giảm xuống đến micro giây. Tuy nhiên, độ chính xác của TIMESTAMPDIFF() (và đơn vị mà nó so sánh) vẫn phụ thuộc vào đơn vị được chỉ định.

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';

Kết quả:

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

Và đây là kết quả nếu chúng ta tăng ngày thứ hai thêm một giây (đưa ngày thứ hai sang ngày hôm sau):

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';

Kết quả:

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

Đây là một ví dụ khác, lần này là xem nó trông như thế nào khi chúng tôi trả về các tháng, quý và năm khi sự khác biệt là một tháng (hoặc 31 ngày):

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';

Kết quả:

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

Ví dụ 4 - Loại đối số sai

Cả hai hàm đều trả về null nếu chúng được truyền sai kiểu đối số.

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

Kết quả:

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

Ví dụ 5 - Loại đối số hỗn hợp

Cả hai hàm đều cho phép bạn cung cấp ngày tháng dưới dạng một đối số và ngày giờ làm đối số khác.

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

Kết quả:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cảnh báo:mysqli_connect ():(HY000 / 1045):Quyền truy cập bị từ chối đối với người dùng 'tên người dùng' @ 'localhost' (sử dụng mật khẩu:CÓ)

  2. Trường bảng có thể chứa dấu gạch nối không?

  3. PostgreSQL và MySQL, một so sánh

  4. Cách khắc phục lỗi MySQL 1064

  5. Cách trả lại vị trí của một mục danh sách trong MySQL