Bài viết này xem xét sự khác biệt giữa hai hàm MySQL; DATEDIFF()
và 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 | +----------+---------------+