2016-09-23 9 views
1

INT(月の値)を年の四半期を表すVARCHARに変換するSQL関数を作成しました。SQL-SERVER四半期機能

私のコードは以下の通りです。私は、この関数を渡す何らかの理由で(私のテストケースでは)有効な日付オブジェクトの場合

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 

私は、単一の文字「Q」背中を出します。

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 - 1文字しか宣言していないので、「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としてEXECUTEを実行)して再試行してください。私は機能が認識されていないというエラーが出てきました。 @アビシェクの答えはうまくいった。 ありがとうbtw私は助けに感謝します。 –

関連する問題