Start Date End Date
4/1/2016 6/30/2016
3/1/2016 9/30/2016
4/25/2016 5/16/2016
2/1/2016 4/30/2016
如果我想在4月的总天数内计算这些范围。
输出:报告月份的天数
30
30
6
30
答案 0 :(得分:0)
假设这是SQL Server,您可以尝试这样的事情:
SET LANGUAGE ENGLISH;
DECLARE @mockTable TABLE(Start Date,[End] Date)
INSERT INTO @mockTable VALUES
('4/1/2016','6/30/2016')
,('3/1/2016','9/30/2016')
,('4/25/2016','5/16/2016')
,('2/1/2016','4/30/2016');
SELECT DATEDIFF(DAY
,CASE WHEN Start>{d'2016-04-01'} THEN Start ELSE {d'2016-04-01'} END
,CASE WHEN [End]<{d'2016-04-30'} THEN [End] ELSE {d'2016-04-30'} END
) +1 AS DaysInApril
FROM @mockTable
根据@ a_horse_with_no_name的评论,这个转化为标准SQL的想法是:
SELECT CASE WHEN end_date <= date '2016-04-30' THEN end_date ELSE date '2016-04-30' END
- CASE WHEN start_date >= date '2016-04-01' THEN start_date else date '2016-04-01' END + 1
FROM SomeTable
答案 1 :(得分:0)
没有硬编码的年份(所以它适用于任何一年而不仅仅是2016年),再次SQL Server。没有健全性检查开始是在结束之前还是范围涵盖4月份......
CREATE TABLE #Test (StartDate DATE,EndDate DATE);
INSERT INTO #Test (StartDate,EndDate) VALUES
('20160401', '20160630')
,('20160301', '20160930')
,('20160425', '20160516')
,('20160201', '20160430');
SELECT
CASE WHEN MONTH(EndDate) > 4 THEN 30 ELSE DAY(EndDate) END - CASE WHEN MONTH(StartDate) < 4 THEN 1 ELSE DAY(StartDate) END + 1
FROM #Test