从月份名称中找到当前月份值最高的 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) [重复]的主要内容,如果未能解决你的问题,请参考以下文章