从月份名称中找到当前月份值最高的 MAX(Month) [重复]

Posted

技术标签:

【中文标题】从月份名称中找到当前月份值最高的 MAX(Month) [重复]【英文标题】:Find the MAX(Month) from Month names with the current month has the highest value [duplicate] 【发布时间】:2013-06-27 02:54:28 【问题描述】:
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)) 来查找每台计算机的最新名称。

正确吗?

【问题讨论】:

但实际上,您应该只将整数存储在数据库中,而不是月份名称。 数据来自 Altiris 查询(软件管理数据库) 【参考方案1】:

试试这个:

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

【讨论】:

这很棒。唯一的问题是它设置了 May = 12 和 June = 1。要修复它,您只需从 SET @V_MonthNo(第 6 行)中删除“+1”。 通过此更改,我们得到: 1 月 7 日 2 月 8 日 3 月 9 日 4 月 10 日 5 月 11 日 6 月 12 日 7 月 1 日 8 月 2 日 9 月 3 日 10 月 4 日 11 月 5 日 12 月 6 日 这在 7 月行不通。 @kevro 检查我更新的答案。它对你有用,我已经测试了几个月。它的工作【参考方案2】:

试试这个:-

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

返回 INT 为

开始

将@mon 声明为 varchar(50)

将@year 声明为 varchar(50)

将@date 声明为 varchar(50)

将@RESULT 声明为varchar(50)

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

设置@year=(如果@mon

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

设置@RESULT=(@mon

返回@结果;

结束

【讨论】:

本期制作:1 月 5 日 2 月 4 日 3 月 3 日 4 月 2 日 5 月 1 日 6 月 0 日 7 月 11 日 8 月 10 日 9 月 9 日 10 月 8 日 11 月 7 日 12 月 6 日 应该显示:1 月 7 日 2 月 8 日 3 月 9 日 4 月 10 日 5 月 11 日 6 月 12 日 7 月 1 日 8 月 2 日 9 月 3 日 10 月 4 日 11 月 5 日 12 月 6 日 试试这个编辑过的脚本 现在可以使用了。谢谢

以上是关于从月份名称中找到当前月份值最高的 MAX(Month) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

csharp 从月份值获取月份名称

csharp 从月份值获取月份名称

根据月份文本自动化日期选择器

在Python中选择过去2年的随机月份

在 Python 中从过去 2 年中选择一个随机月份

如何从当前日期获得准确的年龄(包括年份和月份)?