2014-09-05 85 views
2

我需要变量@end_period作为字符,例如01而不是1 以下代码有什么问题?TSQL - char更改为INT

DECLARE @start_year AS CHAR(4) 
DECLARE @end_year AS CHAR(4) 
DECLARE @start_period AS CHAR(2) 
DECLARE @end_period AS CHAR(2) 
DECLARE @start_date as datetime 
DECLARE @end_date as datetime 

SET @start_year = '2014' 
SET @end_year = '2014' 
SET @start_period = '07' 
SET @end_period = '08' 

SET @end_year = CASE WHEN @end_period ='12' THEN @end_year + 1 ELSE @end_year END 
SET @end_period = CASE WHEN @end_period ='12' THEN '01' ELSE @end_period + 1 END 


select @end_year 
select @end_period 
+0

为什么不用'dateadd'和'datepart'代替所有这些东西。您可以先将日期格式化的字符串转换为日期。 – 2014-09-05 13:29:13

回答

0

这样做:

@end_period + 1 

实施例:

'08'+1 

的字符串 '08' 被转换为整数8,一种是加入,结果=> 9.一种 然后隐式转换回到char(2),即'9'。

可能的转换(隐性或显性)的全矩阵可以发现on MSDN.


解决你的问题,那么你可以添加前导零是这样的:

SET @end_period = CASE WHEN @end_period ='12' THEN '01' ELSE RIGHT('00' + CAST((@end_period + 1) as VARCHAR(2)), 2) END 
+0

你的解释很不错,尽管肯定没有隐式转换返回发生,整个事情将被解释为int(由于更高的数据类型优先级和所有分支必须返回相同的数据类型) - 但是你写的代码似乎并没有消除这个问题。 – DrCopyPaste 2014-09-05 15:30:42

-1

尝试

SET @end_period = CASE WHEN @end_period = '12' THEN '01' 
        ELSE CASE WHEN @end_period > 8 THEN CONVERT(VARCHAR,@end_period + 1) 
          ELSE '0' + CONVERT(VARCHAR,@end_period + 1) 
         END 
       END 
1

使用CHAR有一些奇怪之处。我不知道为什么,但我这样做的时候,我得到你想要的结果:

DECLARE @start_year AS CHAR(4) 
DECLARE @end_year AS CHAR(4) 
DECLARE @start_period AS CHAR(2) 
DECLARE @end_period AS CHAR(2) 
DECLARE @start_date as datetime 
DECLARE @end_date as datetime 

SET @start_year = '2014' 
SET @end_year = '2014' 
SET @start_period = '07' 
SET @end_period = '08' 

SET @end_year = CASE WHEN @end_period ='12' THEN @end_year + 1 ELSE @end_year END 
SET @end_period = CASE WHEN @end_period ='12' THEN '01' ELSE RIGHT('0'+CAST((@end_period + 1) AS varchar(2)) ,2) END 


select @end_year 
select @end_period 

但是当我改变这样的:CAST((@end_period + 1) AS varchar(2))

为了这个:CAST((@end_period + 1) AS char(2))

我只是得到一个“9 '而不是'09'。奇怪的。我不知道为什么。

编辑:神秘解。

我不知道为什么我没有想到这一点。其实,我确实。现在只有上午9点。

因为char(2)必须包含2个字符,所以您看到的'9'实际上是'9'(9后面有一个空格)。所以做右('0'+'9')当然会返回'9'。如果你愿意,你可以使用RTRIM()或REPLACE()去除前面的空格,也可以使用上面说明的varchar类型。

+0

我在我的帖子中解释了*奇怪*转换的原因。这与演员无关,他们无论如何都隐含着。 – Ndech 2014-09-05 12:54:14

+1

Ndech,你真的执行过你的代码吗?因为我刚刚做了,结果我得到了'9'。不是所需的'09'。 – 2014-09-05 12:57:26

+0

我的代码的第一部分解释了它为什么这样工作的原因,为什么不是“怪异”。我的代码的第二部分提供了一个解决方案,和你的一样。 – Ndech 2014-09-05 13:11:15