具体描述(最好可以跨年,到了12月份自动转到1月份 ,不是单纯的+1)
例如用户输入:
开始年月 2017-12
结束年月 2018-04
生成:
2017-12
2018-01
2018-02
2018-03
2018-04
麻烦各位大佬看看这个简单的问题 多谢啦
使用 CTE 递归查询方式。
具体怎写,自己琢磨
这个递归您能写一下吗 多谢啦
生成这个干什么用 直接用这个时间范围不行
用 dateadd(mm,1,'2017-12-01') 返回 2018-01-01,(然后用convert或datepart可获取年月) ,循环几次就可以了。循环次数可以:DateDiff (mm,'2017-12-01','2018-04-01') 获取
这个问题并不复杂,所以题主只是不想自己写代码,或者觉得自己写的太丑了,不能见人。
这种只要月份的,判断其实又不难,碰到12下个月就是年份+1,月份变1而已。
如果不想自己判断,就是用楼上的方式,先变成2008-1-1(具体日期),然后用SQL 函数加一个月,
循环,判断是否超出结束日期,取得的结果再去掉日期就是了。
差不多这个意思
我自己写的虽然可以用 但是感觉有点问题 所以来请教一下
问题出在 P是有范围的 如果不是生成年月 而是生成年月日就会出现 只生成一半的情况
SELECT DISTINCT CONVERT
( VARCHAR ( 7 ), DATEADD( MM, NUMBER, CONVERT ( datetime, '2018-01-01', 20 )), 23 ) AS dd
FROM
MASTER..SPT_VALUES
WHERE
TYPE = 'P'
AND DATEADD(
mm,
NUMBER,
CONVERT ( datetime, '2018-01-01', 20 )) <= CONVERT (
datetime,
'2018-12-12',
20)
DECLARE @begin DATETIME ='2017-07-01'
DECLARE @end DATETIME ='2018-07-01'
WHILE @begin <@end
BEGIN
PRINT SUBSTRING(CONVERT(VARCHAR,@begin, 111),0,8)
SET @begin=DATEADD(m,1,@begin)
END
正解
with cte_table(CreatedDate) as
(
select cast('2017-12-1' as datetime)
union all
select dateadd(month, 1, CreatedDate)
from cte_table
where CreatedDate < '2018-04-01'
)
select convert(varchar(7), CreatedDate, 120) as YearMonth
from cte_table
option (maxrecursion 0)
可以参考我写的原创博文:
https://www.cnblogs.com/zhang502219048/p/11108991.html