Sql server SQL Server-获取从加入的月份和年份到当前月份的所有月份和年份号

Sql server SQL Server-获取从加入的月份和年份到当前月份的所有月份和年份号,sql-server,common-table-expression,Sql Server,Common Table Expression,我有员工加入日期,从加入日期到我想打印月数和年数的日期 例如,员工已于2020年7月加入,我需要获得以下数据 MonthNumber YearNumber 7 2020 8 2020 9 2020 10 2020 11 2020 12 2020 1 2021 下面是我的查询,我正在使用一个CTE并试图增加它 DECLAR

我有员工加入日期,从加入日期到我想打印月数和年数的日期

例如,员工已于2020年7月加入,我需要获得以下数据

MonthNumber YearNumber
    7          2020
    8          2020
    9          2020
    10         2020
    11         2020
    12         2020
     1         2021
下面是我的查询,我正在使用一个CTE并试图增加它

DECLARE @JoiningDate Date

SET @JoiningDate = '2020-07-04 11:21:03.827'

;With MonthYears as (
SELECT monthNumber = DATEPART(m, @JoiningDate),
       yearNumber = DATEPART(YEAR, DATEADD(m, i+1, @JoiningDate),
       i = 0

UNION ALL

SELECT monthNumber = DATEPART(m, DATEADD(m, i+1, @JoiningDate)),
       yearNumber = DATEPART(YEAR, DATEADD(m, i+1, @JoiningDate)),
       i = i+1
FROM MonthYears
WHERE DATEPART(m, DATEADD(m, i+1, @JoiningDate)) <= DATEPART(m, GETDATE())
AND DATEPART(year, DATEADD(m, i+1, @JoiningDate)) <= DATEPART(year, GETDATE())
)
SELECT * FROM MonthYears

但是我只能看到一条记录,即加入的月份和年份是72020,你的查询的问题是WHERE条件

WHERE DATEPART(m, DATEADD(m, i+1, @JoiningDate)) <= DATEPART(m, GETDATE())
AND DATEPART(year, DATEADD(m, i+1, @JoiningDate)) <= DATEPART(year, GETDATE())

你把要求复杂化了。 您所需要的只是每个月的第一天,您可以通过从@JoiningDate月的第一天开始并递归添加1个月来获取这些日期:

DECLARE @JoiningDate Date;
SET @JoiningDate = '2020-07-04 11:21:03.827';

WITH cte as (
  SELECT DATEFROMPARTS(YEAR(@JoiningDate), MONTH(@JoiningDate), 1) date
  UNION ALL
  SELECT DATEADD(m, 1, date)
  FROM cte
  WHERE DATEADD(m, 1, date) <= GETDATE()
)
SELECT MONTH(date) MonthNumber, 
       YEAR(date) YearNumber 
FROM cte
OPTION (MAXRECURSION 0) -- you may need this because there may exist employees with more than 100 months of employement

也许有一个提示:你不需要日期算术来解决你的问题。你很少会发现一年有超过或少于12个月。你的WHERE条件是错误的DATEPARTm,DATEADDm,i+1,@JoiningDate递归CTE要比理货表或日历表慢得多
DECLARE @JoiningDate Date;
SET @JoiningDate = '2020-07-04 11:21:03.827';

WITH cte as (
  SELECT DATEFROMPARTS(YEAR(@JoiningDate), MONTH(@JoiningDate), 1) date
  UNION ALL
  SELECT DATEADD(m, 1, date)
  FROM cte
  WHERE DATEADD(m, 1, date) <= GETDATE()
)
SELECT MONTH(date) MonthNumber, 
       YEAR(date) YearNumber 
FROM cte
OPTION (MAXRECURSION 0) -- you may need this because there may exist employees with more than 100 months of employement
> MonthNumber | YearNumber
> ----------: | ---------:
>           7 |       2020
>           8 |       2020
>           9 |       2020
>          10 |       2020
>          11 |       2020
>          12 |       2020
>           1 |       2021