MONTH(GetDate())SQL Server 2008 R2返回错误的月份

时间:2014-12-04 16:19:07

标签: sql-server-2008 stored-procedures

我正在努力获得一个简单报告的开始年/月和结束年/月。在我的存储过程中,我有以下内容:

IF @parm_StartYear is null SET @parm_StartYear = CONVERT(VARCHAR(4), DATEPART(YYYY,DATEADD(YYYY, -1, GETDATE())));
IF @parm_StartMonth is null SET @parm_StartMonth = CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE())));
IF @parm_EndYear is null SET @parm_EndYear = CONVERT(VARCHAR(4),DATEPART(YYYY,GETDATE()));
IF @parm_EndMonth is null SET @parm_EndMonth = CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE())));

岁月是正确的,但月份是提前一个月。 IE浏览器。今天是12月(12日),但它将于1月(01)返回。

我是否遗漏了一些简单或完全错误的事情?我看到的每个示例和其他问题都或多或少地显示了这个确切的代码。

2 个答案:

答案 0 :(得分:0)

不要将getdate()投射到一个月 - 所以这有效:

IF @parm_EndMonth is null SET @parm_EndMonth = CONVERT(CHAR(2),DATEPART(MM,GETDATE()));

答案 1 :(得分:0)

这个表达没有意义:

 CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE())));

当您致电MONTH(GETDATE())时,您已经有了整数结果。您不对整数使用DATEPART()函数。我很惊讶,这不会产生错误,直到我记得Sql Server在内部以数字格式存储日期。然后我意识到表达式将返回自Sql Server的纪元以来第12天的结果,在这种情况下:1900年1月13日。这解释了您的1结果。如果在查询窗口中尝试此语句,则可以看到它:

SELECT cast(12 as datetime)

你真正需要的是:

CONVERT(VARCHAR(2),MONTH(GETDATE()))

我也想知道你为什么要在这里寻找角色结果。如果你想要单独的字段,我真的只是停止使用整数,并让客户端代码担心它是一个字符串:

MONTH(GETDATE())

使用包含parm令牌的变量名称,我担心您将此传递给另一个程序,该程序使用字符串作为日期执行一些非常可怕的事情,而它应该只使用{{1} }值。