2016-06-02 2 views
0

시작 연도와 월 범위와 끝 연도와 월 범위 내에서 데이터를 쿼리하려고합니다. 그러나 SQL은 선택한 년과 달에 반품됩니다. 누구든지 내 접근 방식으로 문제를 식별 할 수 있습니까?TSQL 년과 월의 범위 내의 데이터를 선택하십시오.

감사합니다.

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 
+0

어떤 SQL Server 버전을 사용하고 있습니까? –

답변

0

날짜 값으로 변환해야합니다. SQL 서버 2012 이상에서

, 당신이 할 내장 함수 DATEFROMPARTS을 사용할 수 있습니다 : 당신이 이전 버전의 SQL Server를 사용하는 경우에는

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

을, 당신은 문자열을 구축 할 필요가 날짜를 나타냅니다 (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)) 
+0

니스, 그 worx .. 사실 저는 이전 버전과 함께 일하고 있습니다. 무슨 일이 일어나고 있는지 더 잘 이해하려면 솔루션을 살펴 봐야 할 것입니다. –