2014-12-04 58 views
0

我正在尝试获取简单报告的开始年份/月份和结束年份/月份。在我的存储过程中,我有以下内容:MONTH(GetDate())SQL Server 2008 R2返回错误的月份

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),但它将在一月(01)回归。

我是否错过了简单的东西或者做了什么错误的事情?我看到的每个示例和其他问题都或多或少地显示了这个确切的代码。

回答

0

不要投getdate()到月 - 所以此工程:

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

OMG。很简单,谢谢。我在这个哈哈上浪费了几个小时。干杯! – rookie68 2014-12-04 16:31:21

+1

MONTH()'调用不是一个强制转换:这是一个函数调用 – 2014-12-04 16:34:03

+0

出于某种原因,我认为我需要Month()调用来获取要转换的日期的月份部分。我迷惑自己。 – rookie68 2014-12-04 16:36:24

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令牌的变量名,我很担心你的传球这到另一个程序,正在做一些非常可怕的事情与字符串作为日期,当它应该只与DateTime值。 OMG。