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

MySQL TIMEDIFF () 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 MySQL TIMEDIFF()TIMESTAMPDIFF() các chức năng.

Cả hai chức năng đều hoạt động tương tự, nhưng có một số khác biệt đáng kể giữa hai chức năng.

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

TIMEDIFF() 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 (date1 - date2). Trừ đối số thứ 2 khỏi đối số thứ 3 (date2 - date1).
Kết quả được biểu thị dưới dạng giá trị thời gian (và nó có những hạn chế của kiểu dữ liệu thời gian). Kết quả là một số nguyên, được biểu thị bằng một số đơn vị như được cung cấp bởi đối số đầu tiên.
Chấp nhận biểu thức thời gian hoặc ngày giờ. Chấp nhận biểu thức ngày tháng hoặc ngày giờ.
Cả hai đối số phải cùng loại (thời gian hoặc ngày giờ). Cả hai đối số có thể thuộc một loại khác nhau (ngày tháng hoặc ngày giờ).

Ví dụ 1 - Sự khác biệt Cơ bản

Dưới đây là một ví dụ chứng minh sự khác biệt cơ bản giữa các chức năng này.

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

Kết quả:

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

Vì vậy, chúng ta có thể thấy rằng TIMEEDIFF() trả về một giá trị thời gian và TIMESTAMPDIFF() trả về một số nguyên.

Ngoài ra, TIMEEDIFF() đã trừ ngày thứ 2 khỏi ngày 1, trong khi TIMESTAMPDIFF() đã trừ ngày đầu tiên khỏi ngày thứ 2.

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

Như đã đề cập, TIMESTAMPDIFF() cho phép chúng tôi chỉ định đơn vị nào sẽ đại diện cho kết quả. Dưới đây là một số ví dụ:

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

Kết quả:

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

Tuy nhiên, đây là điều sẽ xảy ra nếu chúng tôi sử dụng đơn vị lớn hơn chênh lệch thời gian thực tế:

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

Kết quả:

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

Trong trường hợp này, chênh lệch thời gian không đủ lớn để ảnh hưởng đến giá trị tuần hoặc tháng.

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

Dưới đây là một ví dụ về những gì sẽ xảy ra khi bạn chuyển các loại đối số sai cho mỗi hàm.

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

Kết quả:

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

TIMEDIFF() không hỗ trợ kiểu dữ liệu "date" và do đó, nó trả về 00:00:00 .

TIMESTAMPDIFF() hàm không hỗ trợ kiểu dữ liệu 'time', vì vậy nó trả về NULL .

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

Đây là điều sẽ xảy ra nếu bạn cung cấp hai loại dữ liệu khác nhau cho mỗi chức năng.

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

Kết quả:

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

Vì vậy, chúng ta có thể thấy rằng TIMESTAMPDIFF() xử lý tốt các loại dữ liệu hỗn hợp (miễn là chúng là ngày tháng hoặc ngày giờ).

Tuy nhiên, TIMEDIFF() yêu cầu cả hai đối số phải cùng kiểu, vì vậy chúng tôi nhận được NULL , mặc dù cả hai đối số đều thuộc loại mà hàm hỗ trợ (thời gian và ngày giờ).

Chúng tôi có thể xác nhận rằng cả hai loại trên thực tế đều được hỗ trợ bởi chức năng này bằng ví dụ sau:

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

Kết quả:

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

Vì vậy, không sao cả, miễn là cả hai đối số đều cùng loại (giá trị thời gian hoặc ngày giờ).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT COUNT (*) AS count - Cách sử dụng số đếm này

  2. # 1071 - Khóa được chỉ định quá dài; độ dài khóa tối đa là 1000 byte

  3. Bảng tổng hợp động MySQL

  4. Cách nhận dữ liệu tuần hiện tại trong MySQL

  5. Truy vấn được tham số hóa cho MySQL với C #