Hai hàm date có trong MySQL là DATEDIFF()
và TIMEDIFF()
.
Cả hai chức năng đều hoạt động tương tự, nhưng có một số khác biệt có ý nghĩa.
Bảng sau đây tóm tắt sự khác biệt giữa hai chức năng này:
DATEDIFF() | TIMEDIFF() |
---|---|
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 giá trị thời gian. |
Chỉ so sánh giá trị ngày tháng của các đối số của nó. | So sánh giá trị thời gian của các đối số của nó. |
Chấp nhận ngày tháng hoặc các biểu thức ngày và giờ. | Chấp nhận biểu thức thời gian hoặc ngày và giờ. |
Cả hai đối số có thể thuộc loại khác nhau (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ờ). |
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 DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Kết quả:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 24:00:00 | +----------+----------+
Vì vậy, chúng ta có thể thấy rằng DATEDIFF()
trả về 1
, nghĩa là “1 ngày” và TIMEDIFF()
trả lại 24:00:00
là đại diện thời gian của chính xác 1 ngày.
Ví dụ 2 - Chỉ định Giá trị Thời gian
Hãy xem điều gì sẽ xảy ra nếu chúng ta tăng giá trị thời gian của một trong các biến.
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Kết quả:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 36:15:35 | +----------+----------+
Vì vậy, DATEDIFF()
trả về kết quả tương tự như trong ví dụ trước. Điều này là do nó chỉ so sánh các giá trị ngày (nó bỏ qua bất kỳ giá trị thời gian nào).
TIMEDIFF()
mặt khác, hàm so sánh thời gian và do đó nó trả về một kết quả chính xác hơn. Nó cho chúng ta thấy rằng có 36 giờ, 15 phút và 35 giây giữa hai giá trị ngày và giờ.
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 DATEDIFF(@date1, @date2) AS 'DATEDIFF Date', DATEDIFF(@time1, @time2) AS 'DATEDIFF Time', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';
Kết quả:
+---------------+---------------+---------------+---------------+ | DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time | +---------------+---------------+---------------+---------------+ | 1 | NULL | 00:00:00 | 12:15:35 | +---------------+---------------+---------------+---------------+
Kết quả đầu tiên và kết quả cuối cùng đều ổn vì các loại đối số chính xác đã được chuyển vào. Tuy nhiên, hai kết quả ở giữa có loại dữ liệu được truyền sai và do đó không thể tính được kết quả chính xác.
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 DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';
Kết quả:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | NULL | +----------+----------+
Vì vậy, chúng ta có thể thấy rằng DATEDIFF()
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 và 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 với 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 | +----------+----------+