在报告月份中计算日期

时间:2016-06-08 08:05:58

标签: sql

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

2 个答案:

答案 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 

编辑:标准SQL

根据@ 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