0
IF object_id('tempdb..#A')  IS NOT NULL DROP TABLE #A
CREATE TABLE #A (Computer varchar(20), Name varchar(20), Month varchar(20))

INSERT INTO #A
SELECT 'PC1', 'Bob', 'June'
UNION ALL
SELECT 'PC1', 'Tammy', 'January'
UNION ALL
SELECT 'PC1', 'Wes', 'September'
UNION ALL 
SELECT 'PC1', 'Susan', 'October'
UNION ALL
SELECT 'PC1', 'Kevin', 'February'


SELECT * FROM #A

这会产生结果:

  Computer  Name        Month
    PC1     Bob         June
    PC1     Tammy       January
    PC1     Wes         September
    PC1     Susan       October
    PC1     Kevin       February

月份列是当月登录此计算机的最受欢迎的用户。

我想显示最近登录的用户,但他们可能本月甚至上个月都没有登录。

在上面的例子中,如果今天是六月,我会选择 PC1 Kevin。

所以真的,我想要一个函数返回一个相对于当前月份的指定月份的数字 1-12 。

如果今天是 6 月 26 日,那么

udf_month('June') would return 12
udf_month('May') would return 11
udf_month('January') would return 7
udf_month('December') would return 6
udf_month('July') would return 1

如果今天是 7 月 1 日,则 udf_month('June') 将返回 11

然后我可以执行 SELECT Computer, Name, Max(udf_Month(Month)) 来查找每台计算机的最新名称。

正确的?

4

2 回答 2

2

尝试这个:

CREATE FUNCTION [dbo].[udf_month](@V_Month AS VARCHAR(20)) 
RETURNS INT AS 
BEGIN
    DECLARE @V_MonthNo INT, @V_InputMonthNo INT, @V_CurrentMonthNo INT;
    SELECT @V_InputMonthNo = DATEPART(MM, @V_Month + ' 01 2013'), @V_CurrentMonthNo = MONTH(GETDATE());
    SET @V_MonthNo = 12 - @V_CurrentMonthNo + @V_InputMonthNo;

    IF (@V_MonthNo > 12) 
    BEGIN 
        SET @V_MonthNo = @V_MonthNo - 12;
    END

    RETURN @V_MonthNo;
END
于 2013-06-27T05:42:18.620 回答
1

尝试这个:-

ALTER FUNCTION [dbo].[udf_month](@Month AS VARCHAR(20))

返回 INT AS

开始

将@mon 声明为 varchar(50)

将@year 声明为 varchar(50)

将@date 声明为 varchar(50)

将@RESULT 声明为 varchar(50)

设置 @mon= (选择 DATEPART(MM, @Month + '01 2012'))

设置@year=(case when @mon<=MONTH(getdate()) then YEAR(getdate())+1 ELSE YEAR(getdate()) END)

设置@date=(选择@mon+'-01-'+@year)

设置 @RESULT= ( case when @mon<=MONTH(getdate()) 然后 DATEDIFF(mm,getdate(),@date) ELSE replace(DATEDIFF(mm,@date,getdate()),'-','' ) 结尾)

返回@结果;

结尾

于 2013-06-27T07:14:17.007 回答