我有一个要求,从三个参数开始:
@startyear INT (e.g. 2016),
@endyear INT (e.g. 2050),
@cycle VARCHAR(9) (e.g. 4-6-6-6-6).在选择这些年时,SQL Server应该在每次将@cycle中指定的年数相加时,填充一个表,其中的年份介于@start放年和@end放年之间。我意识到这听起来可能让人困惑,下面是一个例子。如果“周期为4-6-6-6-6 -6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-
2020 (2016 + 4 years, i.e. first number in @cycle)
2026 (2020 + 6 years, i.e. second number in @cycle)
2032 (2026 + 6 years, and so on..)
2038 (2032 + 6 years)
2044 (2038 + 6 years)
2048 (2044 + 4 years)任何帮助都将不胜感激!谢谢。
发布于 2016-05-08 22:27:31
编辑是因为原来的答案误解了这个问题:
DECLARE @startyear INT = 2016, @endyear INT = 2080, @cycle VARCHAR(9) = '4-6-6-6-6';
WITH CTE1 AS (
SELECT SUBSTRING(@cycle, A.B, 1) S, ROW_NUMBER() OVER (ORDER BY A.B) RN
FROM (
VALUES (1), (3), (5), (7), (9)) A(B))
, E1(N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) A(B))
, E2(N) AS (SELECT 1 FROM E1 A CROSS JOIN E1)
, CTE2 AS (
SELECT CAST(CTE1.S AS INT) S, (E2.N - 1) * 5 + RN RN
FROM CTE1
CROSS JOIN (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2) E2(N)
WHERE E2.N <= (SELECT (@endyear - @startyear) / SUM(CAST(S AS INT)) + 1 FROM CTE1))
SELECT @startyear + SUM(T2.S) Years
FROM CTE2 T1
JOIN CTE2 T2 ON T1.RN >= T2.RN
GROUP BY T1.RN
HAVING @startyear + SUM(T2.S) < @endyear
ORDER BY T1.RN;这将查看@循环输入,遍历它多次(根据与@end放-@start年份相比,@循环中的输入之和),然后根据它查找所有年份之间的所有年份。
注意:它要求输入为个位数(用单个字符分隔符分隔),并要求循环总数小于100个(例如,如果您想要循环@cycle超过100次,则需要更改,但我怀疑情况是否如此)。
https://stackoverflow.com/questions/37105053
复制相似问题