SQL-SERVER Quarter函数

时间:2016-09-23 09:44:08

标签: sql sql-server function sql-function

我编写了一个SQL函数来将INT(月份值)转换为表示一年中的季度的VARCHAR。

我的代码如下。

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&#39; Q&#39;退出。

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

EXEC @Qat = sf_Quarters @DATE

SELECT @Qat

我意识到我可能正在做一些破坏它的事情。我只是不明白为什么它只返回第一个CHARS。

我还用函数(Current_Timestamp)替换了我的固定日期字符串,得到了相同的结果。

2 个答案:

答案 0 :(得分:2)

这似乎更简单:

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

至于你的问题,调用函数的方法是使用SELECT

SELECT @Qat = sf_Quarters(@DATE);

您正在调用该函数,就好像它是一个存储过程一样。我很惊讶这一点很有用。

答案 1 :(得分: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

注意:按照Gordon建议的方式调用函数