Sql server SQL Server存储过程生成与两个日期之间的月份相关的数据

Sql server SQL Server存储过程生成与两个日期之间的月份相关的数据,sql-server,stored-procedures,Sql Server,Stored Procedures,我被困在下面的问题上 我有一个由一个查询计算的开始范围日期和结束范围日期,还有三列由另一个查询生成,最后一个查询的结果是: PRJ_ID | START_DATE | END_DATE 我想使用一个存储过程生成一个输出,该存储过程考虑开始范围日期和结束范围日期之间的所有月份,生成如下输出: PRJ_ID | MONTHS1 | MONTHS2 | ... | MONTHSN XXXX | YES | YES | ... | NO 通过检查当前月份是否在项目的开始日期和结束

我被困在下面的问题上

我有一个由一个查询计算的开始范围日期和结束范围日期,还有三列由另一个查询生成,最后一个查询的结果是:

PRJ_ID | START_DATE | END_DATE
我想使用一个存储过程生成一个输出,该存储过程考虑开始范围日期和结束范围日期之间的所有月份,生成如下输出:

PRJ_ID | MONTHS1 | MONTHS2 | ... | MONTHSN
XXXX   | YES     | YES     | ... | NO
通过检查当前月份是否在项目的开始日期和结束日期之间(上表),可以获得是或否

我可以使用以下代码生成两个日期之间的所有月份:

DECLARE @StartDate  DATETIME,
        @EndDate    DATETIME;

SELECT   @StartDate = '20110501'        
        ,@EndDate   = '20110801';


SELECT  DATENAME(MONTH, DATEADD(MONTH, x.number, @StartDate)) AS MonthName
FROM    master.dbo.spt_values x
WHERE   x.type = 'P'        
AND     x.number <= DATEDIFF(MONTH, @StartDate, @EndDate);
DECLARE@StartDate DATETIME,
@结束日期日期时间;
选择@StartDate='20110501'
,@EndDate='20110801';
选择DATENAME(MONTH,DATEADD(MONTH,x.number,@StartDate))作为MonthName
从master.dbo.spt_值x
其中x.type='P'

那么x.number你是指这样的东西吗

DECLARE @t TABLE(PRJ_ID INT,  START_DATE DATE, END_DATE date)
INSERT INTO @t VALUES
(1, '20110501', '20110801'),
(2, '20110101', '20110901'),
(3, '20110301', '20110401')

;WITH cte1 AS(SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(m)),
cte2 AS(SELECT * FROM cte1 c1 JOIN @t t ON c1.m BETWEEN MONTH(t.START_DATE) AND MONTH(t.END_DATE))
SELECT  PRJ_ID, 
        START_DATE, 
        END_DATE, 
        CASE WHEN [1] IS NOT NULL THEN 'YES' ELSE 'NO' END AS January,
        CASE WHEN [2] IS NOT NULL THEN 'YES' ELSE 'NO' END AS February,
        CASE WHEN [3] IS NOT NULL THEN 'YES' ELSE 'NO' END AS March,
        CASE WHEN [4] IS NOT NULL THEN 'YES' ELSE 'NO' END AS April,
        CASE WHEN [5] IS NOT NULL THEN 'YES' ELSE 'NO' END AS May,
        CASE WHEN [6] IS NOT NULL THEN 'YES' ELSE 'NO' END AS June,
        CASE WHEN [7] IS NOT NULL THEN 'YES' ELSE 'NO' END AS July,
        CASE WHEN [8] IS NOT NULL THEN 'YES' ELSE 'NO' END AS August,
        CASE WHEN [9] IS NOT NULL THEN 'YES' ELSE 'NO' END AS September,
        CASE WHEN [10] IS NOT NULL THEN 'YES' ELSE 'NO' END AS October,
        CASE WHEN [11] IS NOT NULL THEN 'YES' ELSE 'NO' END AS November,
        CASE WHEN [12] IS NOT NULL THEN 'YES' ELSE 'NO' END AS December
FROM cte2
PIVOT (MAX(m) FOR m IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p
输出:

PRJ_ID  START_DATE  END_DATE    January February    March   April   May June    July    August  September   October November    December
1       2011-05-01  2011-08-01  NO      NO          NO      NO      YES YES     YES     YES     NO          NO      NO          NO
2       2011-01-01  2011-09-01  YES     YES         YES     YES     YES YES     YES     YES     YES         NO      NO          NO
3       2011-03-01  2011-04-01  NO      NO          YES     YES     NO  NO      NO      NO      NO          NO      NO          NO

你必须使用枢轴。由于月数会有所不同,您必须使用动态SQL。@JulienVasseur是否有任何示例或链接可以让我更好地理解该解决方案?google SQL dynamic Pivot我还没有尝试过,但该解决方案只能使用一年,月列表超过一年。我是否错过了您问题中的重要信息??在这种情况下,结果应该是什么样的?很抱歉,我没有声称每年都会有这样的结果。所以这个月的输出应该是“2011年1月”…“2015年1月”。好的,如果一个项目是“20100101”-“20110101”,另一个是“20130101”-“20150101”,会怎么样?输出结果是什么?我计算最小开始日期和最大结束日期,然后我必须对项目不活动的所有月份设置否,即月份不在开始日期和结束日期内。例如,对于第一个项目,20100101月是肯定的,而对于第二个项目,则是否定的