최근 프로젝트의 요구 사항은 자원이 완전히 소비되는시기를보고하는 것이 었습니다. 나는 피로한 달력 날짜뿐만 아니라 남은 시간을 영어와 같은 형식으로 보여 달라는 요청을 받았습니다. "1 년, 3 개월".
내장 DATEDIFF
기능
지정된 시작 날짜와 종료 날짜 사이에 지정된 날짜 부분 경계의 개수를 반환합니다.
있는 그대로 사용하면 오해의 소지가 있거나 혼란스러운 결과가 발생할 수 있습니다. 예를 들어, YEAR 간격을 사용하면 1999-12-31 (YYYY-MM-DD) 및 2000-01-01이 1 년 간격으로 표시되지만 상식적으로는이 날짜가 1 일로 분리되어 있다고합니다. 반대로 1999-12-31 일과 2010-12-31 일 사이의 간격을 사용하면 4,018 일로 분리되지만 대부분의 사람들은 "11 년"을 더 나은 설명으로 간주합니다.
일 수부터 시작하여 월과 연도를 계산하면 연도 및 월 크기 오류가 발생하기 쉽습니다.
다양한 SQL 방언으로 이것이 어떻게 구현 될 수 있는지 궁금합니다. 출력 예는 다음과 같습니다.
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)
SQL Server 2008R2를 사용하고 있지만 다른 방언이 어떻게 처리하는지 배우고 싶습니다.