SQL-SERVER四分之一函数
SQL-SERVER Quarter 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' 退出。
DECLARE @DATE DATE = '20090405'
DECLARE @Qat VARCHAR
EXEC @Qat = sf_Quarters @DATE
SELECT @Qat
我意识到我可能正在做一些破坏它的愚蠢事情。我只是不明白为什么它只返回第一个字符。
我也用函数 (Current_Timestamp) 替换了我的固定日期字符串并得到了相同的结果。
做起来好像简单多了:
select 'Q' + datename(quarter, dateadd(month, -3, @date))
关于你的问题,调用函数的方式是使用SELECT
:
SELECT @Qat = sf_Quarters(@DATE);
您正在调用该函数,就好像它是一个存储过程一样。我很惊讶这完全有效。
问题出在你调用函数的第二部分 -
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 建议的方式调用函数
我已经编写了一个 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' 退出。
DECLARE @DATE DATE = '20090405'
DECLARE @Qat VARCHAR
EXEC @Qat = sf_Quarters @DATE
SELECT @Qat
我意识到我可能正在做一些破坏它的愚蠢事情。我只是不明白为什么它只返回第一个字符。
我也用函数 (Current_Timestamp) 替换了我的固定日期字符串并得到了相同的结果。
做起来好像简单多了:
select 'Q' + datename(quarter, dateadd(month, -3, @date))
关于你的问题,调用函数的方式是使用SELECT
:
SELECT @Qat = sf_Quarters(@DATE);
您正在调用该函数,就好像它是一个存储过程一样。我很惊讶这完全有效。
问题出在你调用函数的第二部分 -
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 建议的方式调用函数