Một yêu cầu trong một dự án gần đây là báo cáo khi nào tài nguyên sẽ được tiêu thụ hết. Cũng như ngày hết hạn tôi được yêu cầu hiển thị thời gian còn lại ở định dạng giống như tiếng Anh, đại loại như "1 năm, 3 tháng để đi".
Việc xây dựng trong DATEDIFF
chức năng
Trả về số lượng ... của các ranh giới ngày tháng được chỉ định được giao giữa ngày bắt đầu và ngày kết thúc được chỉ định.
Nếu được sử dụng như là điều này có thể tạo ra kết quả sai lệch hoặc gây nhầm lẫn. Ví dụ: sử dụng khoảng thời gian NĂM sẽ hiển thị 1999-12-31 (YYYY-MM-DD) và 2000-01-01 cách nhau một năm trong khi thông thường sẽ nói những ngày này chỉ cách nhau 1 ngày. Ngược lại, sử dụng khoảng thời gian NGÀY 1999-12-31 và 2010-12-31 cách nhau 4.018 ngày trong khi hầu hết mọi người sẽ xem "11 năm" là một mô tả tốt hơn.
Bắt đầu từ số ngày và tính toán tháng và năm từ đó sẽ dễ bị lỗi năm và kích thước của tháng.
Tôi đã tự hỏi làm thế nào điều này có thể được thực hiện trong các phương ngữ SQL khác nhau? Ví dụ đầu ra bao gồm:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', '1 month, 1 day'), -- leap years to be accounted for
('2000-01-01', '2000-12-31', '11 months, 30 days'),
('2000-02-28', '2000-03-01', '2 days'),
('2001-02-28', '2001-03-01', '1 day'), -- not a leap year
('2000-01-01', '2001-01-01', '1 year'),
('2000-01-01', '2011-01-01', '11 years'),
('9999-12-30', '9999-12-31', '1 day'), -- catch overflow in date calculations
('1900-01-01', '9999-12-31', '8099 years 11 months 30 days'); -- min(date) to max(date)
Tôi tình cờ sử dụng SQL Server 2008R2 nhưng tôi muốn tìm hiểu cách các phương ngữ khác sẽ xử lý việc này.