我正在努力获得一个简单报告的开始年/月和结束年/月。在我的存储过程中,我有以下内容:
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)返回。
我是否遗漏了一些简单或完全错误的事情?我看到的每个示例和其他问题都或多或少地显示了这个确切的代码。
答案 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} }值。