2016-09-23 4 views
1

INT (월 값)을 해당 연도의 분기를 나타내는 VARCHAR로 변환하는 SQL 함수를 작성했습니다.SQL-SERVER 분기 함수

내 코드는 다음과 같습니다. 나는 단지 다시 밖으로 단일 문자 'Q'를 얻을 (내 테스트 케이스에서)이 기능을 유효 날짜 개체를 전달 몇 가지 이유를 들어

ALTER FUNCTION [sf_Quarters] (@DATE date) 
Returns VARCHAR(4) 
WITH EXECUTE AS CALLER 
AS 
BEGIN 

DECLARE @QUARTER VARCHAR(4) = ''; 
DECLARE @DATEMONTH INT = DATEPART(MONTH, @DATE); 

SELECT @QUARTER = 
CASE 
    WHEN @DATEMONTH > 3 AND @DATEMONTH < 7 THEN 'Q1' 
    WHEN @DATEMONTH > 6 AND @DATEMONTH < 10 THEN 'Q2' 
    WHEN @DATEMONTH > 9 AND @DATEMONTH <= 12 THEN 'Q3' 
    WHEN @DATEMONTH > 0 AND @DATEMONTH < 4 THEN 'Q4' 
    ELSE NULL 
END 
RETURN @QUARTER 
END 

.

DECLARE @DATE DATE = '20090405' 
DECLARE @Qat VARCHAR 

EXEC @Qat = sf_Quarters @DATE 

SELECT @Qat 

실감 나는 무언가를 잘못하고 있다고 생각합니다. 나는 단지 왜 CHARS의 첫 번째를 반환하는지 이해할 수 없다.

또한 고정 된 날짜 문자열을 (Current_Timestamp) 함수로 대체했으며 동일한 결과를 얻었습니다. 그것은 훨씬 간단 할 것 같다

+0

선택 @Qat = dbo.sf_Quarters를 호출하기 위해 제안 된 방법에 따라를 @ DATE) – BhatiaAshish

+0

DECLARE @Qat VARCHAR - 하나의 문자 만 선언 했으므로 'Q'만 얻는 것입니다. –

답변

2

문제는 당신이 함수를 호출하는 두 번째 부분에 -

DECLARE @DATE DATE = '20090405' 
DECLARE @Qat VARCHAR -- change it to VARCHAR(4) 
--varchar [ (n | max) ] 
--When n is not specified in a data definition or variable declaration statement, the default length is 1 
EXEC @Qat = sf_Quarters @DATE 

SELECT @Qat 

참고 : 고든 (함수에게

+1

도움을 청하게하면, 나는 그것이 어리석은 무엇인가 일 것임을 알았다. @Qat 선언을 변경하면 수정되었습니다. –

+0

그는 함수가 있고 함수를 실행하지 않기 때문에 옳다고 생각하지 않습니다. 스칼라이면 값을 선택하거나 tvf이면 함수에서 선택하십시오. –

2

: 귀하의 질문에 관해서는

select 'Q' + datename(quarter, dateadd(month, -3, @date)) 

, 함수를 호출 할 수있는 방법은 SELECT을 사용하고 있습니다 :

SELECT @Qat = sf_Quarters(@DATE); 

는 것처럼 당신은 함수를 호출 저장 프로 시저 나는 놀랍다.

+0

그래, 먼저 솔루션을 시도했는데 실제로 이런 식으로 실행되지는 않습니다. 선언을 실행하고 (CALLER로 실행) 다시 시도하십시오. 내가 인식되지 않는 기능에 관한 오류가 계속 발생했습니다. @ Abhishek의 대답은 효과가있었습니다. 감사합니다. 도움에 감사드립니다. –