Un requisito in un recente progetto era di segnalare quando una risorsa sarebbe stata completamente consumata. Oltre alla data del calendario di esaurimento, mi è stato chiesto di mostrare il tempo rimanente in formato inglese, qualcosa come "1 anno, 3 mesi alla fine".
La DATEDIFF
funzione integrata
Restituisce il conteggio ... dei limiti di datepart specificati attraversati tra la data di inizio e la data di fine specificate.
Se usato così com'è, ciò potrebbe produrre risultati fuorvianti o confusi. Ad esempio, l'utilizzo di un intervallo di ANNO mostrerebbe 1999-12-31 (AAAA-MM-GG) e 2000-01-01 distanti un anno, mentre il senso comune direbbe che queste date sono separate da un solo giorno. Al contrario, utilizzando un intervallo di DAY 1999-12-31 e 2010-12-31 sono separati da 4.018 giorni, mentre la maggior parte delle persone vedrebbe "11 anni" come una descrizione migliore.
A partire dal numero di giorni e calcolando mesi e anni da lì sarebbe incline a saltare l'anno e gli errori di dimensione del mese.
Mi chiedo come possa essere implementato nei vari dialetti SQL? L'output di esempio include:
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)
Mi capita di usare SQL Server 2008R2 ma sono interessato a sapere come gli altri dialetti lo gestiranno.