Un requisito en un proyecto reciente era informar cuándo un recurso se consumiría por completo. Además de la fecha del calendario de agotamiento, me pidieron que mostrara el tiempo restante en un formato similar al inglés, algo así como "1 año, 3 meses para el final".
La DATEDIFF
función incorporada
Devuelve el recuento ... de los límites de parte de fecha especificados cruzados entre la fecha de inicio y la fecha de finalización especificadas.
Si se usa como está, esto podría producir resultados engañosos o confusos. Por ejemplo, el uso de un intervalo de AÑO mostraría 1999-12-31 (AAAA-MM-DD) y 2000-01-01 con un año de diferencia, mientras que el sentido común diría que estas fechas están separadas por solo 1 día. Por el contrario, usando un intervalo de DÍA 1999-12-31 y 2010-12-31 están separados por 4,018 días, mientras que la mayoría de las personas vería "11 años" como una mejor descripción.
A partir de la cantidad de días y el cálculo de meses y años a partir de allí, sería propenso a errores de año bisiesto y tamaño de mes.
¿Me preguntaba cómo podría implementarse esto en los diversos dialectos de SQL? La salida de ejemplo incluye:
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)
Estoy usando SQL Server 2008R2 pero estoy interesado en aprender cómo otros dialectos manejarían esto.