ความต้องการในโครงการล่าสุดคือการรายงานเมื่อทรัพยากรจะถูกใช้อย่างเต็มที่ เช่นเดียวกับวันที่ในปฏิทินอ่อนเพลียฉันถูกขอให้แสดงเวลาที่เหลือในรูปแบบเหมือนภาษาอังกฤษบางอย่างเช่น "1 ปี 3 เดือน"
DATEDIFF
ฟังก์ชั่นในตัว
ส่งคืนการนับ ... ของขอบเขตวันที่ที่ระบุซึ่งข้ามระหว่างวันที่เริ่มต้นและวันที่ที่ระบุ
หากใช้ตาม - นี่อาจทำให้เกิดความเข้าใจผิดหรือผลลัพธ์ที่สับสน ตัวอย่างเช่นการใช้ช่วงเวลาของปีจะแสดงปี 1999-12-31 (YYYY-MM-DD) และ 2000-01-01 ให้แยกกันหนึ่งปีในขณะที่สามัญสำนึกจะบอกว่าวันเหล่านี้จะแยกจากกันโดยเพียง 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 แต่ฉันสนใจที่จะเรียนรู้ว่าภาษาถิ่นอื่นจะจัดการเรื่องนี้อย่างไร