Chênh lệch hàng tháng giữa hai ngày nhất định bất kỳ:
Tôi ngạc nhiên là điều này vẫn chưa được đề cập đến:
Hãy xem TIMESTAMPDIFF () trong MySQL.
Điều này cho phép bạn làm là chuyển hai TIMESTAMP
hoặc DATETIME
giá trị (hoặc thậm chí DATE
vì MySQL sẽ tự động chuyển đổi) cũng như đơn vị thời gian bạn muốn dựa vào sự khác biệt của mình.
Bạn có thể chỉ định MONTH
làm đơn vị trong tham số đầu tiên:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
Về cơ bản, nó lấy số tháng trôi qua kể từ ngày đầu tiên trong danh sách tham số. Giải pháp này tự động bù đắp lượng ngày khác nhau trong mỗi tháng (28,30,31) cũng như tính đến các năm nhuận - bạn không phải lo lắng về bất kỳ điều gì trong số đó.
Chênh lệch hàng tháng với độ chính xác:
Sẽ phức tạp hơn một chút nếu bạn muốn giới thiệu độ chính xác thập phân theo số tháng đã trôi qua, nhưng đây là cách bạn có thể làm điều đó:
SELECT
TIMESTAMPDIFF(MONTH, startdate, enddate) +
DATEDIFF(
enddate,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
) /
DATEDIFF(
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
MONTH,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
)
Nơi startdate
và enddate
là các tham số ngày của bạn, cho dù đó là từ hai cột ngày trong bảng hay dưới dạng tham số đầu vào từ tập lệnh:
Ví dụ:
With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097
With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667
With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935