TSQL SELECT 年月范围内的数据

TSQL SELECT data within range of year and month

我正在尝试查询开始年月和结束年月范围内的数据。但是 SQL 只返回所选的年份和月份。任何人都可以用我的方法找出问题所在。

谢谢!

ALTER PROCEDURE xxx 
(@JaarBegin AS int
, @JaarEind AS int
, @MaandBegin AS int
, @MaandEind AS int)

AS
BEGIN

WITH 
CTE AS
(
SELECT [D_Medewerker_ID]
      ,[Gebruikersnaam]
      ,[Naam]
      ,[Afdelingscode]
      ,CONVERT(date, [Datum_uit_dienst]) AS DatumIn
      ,CONVERT(date, [Datum_in_dienst]) AS DatumUit
FROM [DM].[dm].[D_Medewerker] AS M
), 
CTE2 AS(
 SELECT F.[D_Functie_ID] 
      ,[Generieke_Functie] 
      ,[Specifieke_Functie] 
      ,Fo.[D_Medewerker_ID]
  FROM [DM].[dm].[D_Functie] AS F
  JOIN dm.dm.F_FormatieBezetting AS Fo
  ON F.D_Functie_ID = Fo.D_Functie_ID
  )

SELECT DISTINCT CTE.[Gebruikersnaam]
, CTE.Naam
, CTE.Afdelingscode
, CTE.DatumIn
, CTE.DatumUit
, CTE2.Generieke_Functie
, CTE2.Specifieke_Functie
FROM CTE 
JOIN CTE2 
ON CTE.D_Medewerker_ID = CTE2.D_Medewerker_ID
WHERE DATEPART(year,CTE.DatumUit) BETWEEN @JaarBegin AND @JaarEind
AND DATEPART(MONTH, CTE.DatumUit) >= @MaandBegin AND DATEPART(MONTH, CTE.DatumUit) <= @MaandEind
ORDER BY CTE.DatumUit DESC;
END

您需要将获取的 int 值转换为日期值。

在 Sql 服务器 2012 或更高版本中,您可以使用内置函数 DATEFROMPARTS 来执行此操作:

WHERE CTE.DatumUit >= DATEFROMPARTS ( @JaarBegin , @MaandBegin , 1 )  
AND CTE.DatumUit < DATEADD(MONTH, 1, DATEFROMPARTS ( @JaarEind , @MaandBegin , 1 ))

如果您使用的是早期版本的 sql 服务器,您需要构建一个表示日期的字符串(使用 iso 格式 yyyy-mm-dd),然后将其转换为日期:

WHERE CTE.DatumUit >= CAST(RIGHT('0000' + CAST(@JaarBegin as varchar(4)), 4) + '-' + RIGHT('00' + CAST(@MaandBegin as varchar(2)), 2) +'-01' as datetime)
AND CTE.DatumUit < DATEADD(MONTH, 1, CAST(RIGHT('0000' +CAST(@JaarEind as varchar(4)), 4) + '-' + RIGHT('00' + CAST(@MaandBegin as varchar(2)), 2) +'-01' as datetime))