CREATE PROCEDURE DBO.BB_SX_SCLR(@KSRQ VARCHAR(20),@JSRQ VARCHAR(20)) AS
BEGIN
DECLARE @DATE_S DATETIME,@DATE_E DATETIME --定义时间格式的日期变量
DECLARE @DATE_TMP DATETIME --交换日期用的临时变量
BEGIN TRY --开始校验输入是否合法
SET @DATE_S =CONVERT(DATETIME,@KSRQ) --转换输入的字符串日期到时间格式的变量
SET @DATE_E =CONVERT(DATETIME,@JSRQ) --转换输入的字符串日期到时间格式的变量
IF @DATE_S>@DATE_E --如果开始日期大于结束日期,则交换,允许用户输入日期大小相反
BEGIN
SET @DATE_TMP=@DATE_S
SET @DATE_S=@DATE_E
SET @DATE_E=@DATE_TMP
END
END TRY
BEGIN CATCH --错误处理,校验不通过则输出'0000-00'
SELECT '0000-00' LIST
RETURN
END CATCH
DECLARE @CHAR_MONTH VARCHAR(3) --定义月份的字符串临时变量
CREATE TABLE #TMP_BB_SX_SCLR(LIST VARCHAR(7)) --定义存储输出数据的临时表
WHILE (DATEPART(YYYY,@DATE_S)*12+DATEPART(MM,@DATE_S)<=DATEPART(YYYY,@DATE_E)*12+DATEPART(MM,@DATE_E))
--比较条件:当前年份*12<=目标年和月份则继续
BEGIN
SET @CHAR_MONTH=CONVERT(VARCHAR(2),DATEPART(MM,@DATE_S)) --转换当前月份的数据类型到字符串
SET @CHAR_MONTH='0'+@CHAR_MONTH --在月份前加“0”
SET @CHAR_MONTH=SUBSTRING(@CHAR_MONTH,LEN(@CHAR_MONTH)-2+1,2) --截取最后两位确保月份为1和2的时候其显示为01和02
INSERT INTO #TMP_BB_SX_SCLR(LIST) VALUES(CONVERT(VARCHAR(4),DATEPART(YYYY,@DATE_S))+'-'+@CHAR_MONTH)
SET @DATE_S=DATEADD(MM,1,@DATE_S) --当前月份+1
END
SELECT LIST FROM #TMP_BB_SX_SCLR ORDER BY LIST ASC --按照先后顺序返回需要的结果列表
DROP TABLE #TMP_BB_SX_SCLR
END
EXEC BB_SX_SCLR '2017-12-01','2019-2-1'
EXEC BB_SX_SCLR '2019-2-1','2017-12-01'