2010-12-22 45 views
0

的我有以下代码:SQL如何使这个总是返回前一个月

DECLARE @monthPassed VARCHAR(MAX) 
SET @monthPassed = '2010' 

DECLARE @yearPassed VARCHAR(MAX) 
SET @yearPassed = '10' 

DECLARE @TempDate DATETIME 
SET @TempDate = CAST(@monthPassed + '/' + '1' + '/' + @yearPassed AS DATETIME) 

DECLARE @TestDate DATETIME 
SET @TestDate = DATEADD(MONTH, 1, @TempDate) 

这使得@TestDate 10年11月2日。我将如何总是在本月的第一个月回来呢?

+0

我不认为你意思是SET @monthPassed ='2010' – 2010-12-22 22:38:02

回答

2

可能与@monthPassed@yearPassed被倒置有关。切换它们,就我而言,解决了这个问题。

DECLARE @monthPassed VARCHAR(MAX) 
SET @monthPassed = '10' 

DECLARE @yearPassed VARCHAR(MAX) 
SET @yearPassed = '2010' 

DECLARE @TempDate DATETIME 
SET @TempDate = CAST(@monthPassed + '/' + '1' + '/' + @yearPassed AS DATETIME) 

DECLARE @TestDate DATETIME 
SET @TestDate = DATEADD(MONTH, 1, @TempDate) 

SELECT @TestDate; 

结果:

+-------------------------+ 
| (no column name)  | 
+-------------------------+ 
| 2010-11-01 00:00:00.000 | 
+-------------------------+ 
0

你得到了月分配到一年,反之亦然

0
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) 
0

使用变量/宽度适当的参数应该强调了这个问题,你将年份分配给月份变量,反之亦然。

考虑增加验证,以确保该参数值是数字,与范围等

使用“年月日”提供免疫力区域设置问题的格式:

DECLARE @yearPassed CHAR(4); 
SET @yearPassed = '2010'; 

DECLARE @monthPassed CHAR(2); 
SET @monthPassed = '10'; 

DECLARE @TestDate DATETIME 
SET @TestDate = CAST(@yearPassed + @monthPassed + '01' AS DATETIME); 
相关问题