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月是肯定的,而对于第二个项目,则是否定的