Sql server SQL Server-获取从加入的月份和年份到当前月份的所有月份和年份号
我有员工加入日期,从加入日期到我想打印月数和年数的日期 例如,员工已于2020年7月加入,我需要获得以下数据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
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