Bài viết này xem xét sự khác biệt giữa MySQL TIMEDIFF()
và 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
.
Và 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ờ).