Suatu persyaratan dalam proyek baru-baru ini adalah untuk melaporkan kapan sumber daya akan dikonsumsi sepenuhnya. Serta tanggal kalender yang melelahkan saya diminta untuk menunjukkan waktu yang tersisa dalam format seperti bahasa Inggris, sesuatu seperti "1 tahun, 3 bulan lagi."
Built-in DATEDIFF
fungsi
Mengembalikan hitungan ... dari batas datepart yang ditentukan melintasi antara tanggal mulai dan akhir yang ditentukan.
Jika digunakan apa adanya, ini bisa menghasilkan hasil yang menyesatkan atau membingungkan. Misalnya, menggunakan interval YEAR akan menunjukkan 1999-12-31 (YYYY-MM-DD) dan 2000-01-01 menjadi satu tahun terpisah sedangkan akal sehat akan mengatakan bahwa tanggal-tanggal ini dipisahkan oleh hanya 1 hari. Sebaliknya menggunakan interval DAY 1999-12-31 dan 2010-12-31 dipisahkan oleh 4.018 hari sementara kebanyakan orang akan melihat "11 tahun" sebagai deskripsi yang lebih baik.
Mulai dari jumlah hari dan perhitungan bulan dan tahun dari sana akan cenderung untuk melewati tahun dan ukuran bulan.
Saya bertanya-tanya bagaimana ini dapat diimplementasikan dalam berbagai dialek SQL? Contoh output meliputi:
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)
Saya kebetulan menggunakan SQL Server 2008R2 tetapi saya tertarik untuk mempelajari bagaimana dialek lain akan menangani ini.