2016-09-23 44 views
1

我已經寫了一個SQL函數來將一個INT(月份值)變成一個VARCHAR,代表一年的季度。SQL服務器四分之一函數

我的代碼如下。

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 - 我記得它只聲明瞭一個字符,這就是爲什麼你只能得到'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

是的,我首先嚐試了你的解決方案,它實際上並沒有這樣開火,我甚至拿出了聲明(WITH EXECUTE AS CALLER)並再次嘗試。我不斷地收到有關該功能未被識別的錯誤。 @ Abhishek的答案雖然工作。 謝謝btw我欣賞幫助。 –