对于数据类型为numeric或nchar的列,以YYYMM等值更新YEAR数据

问题描述 投票:0回答:3

我正在努力更新数据库中某些列的YEAR数据。值类似于201201(年+月)。此列的数据类型(month_id)是数字。我只需要将201201更改为201501,201301到201601,这样就可以将+3添加到年份。我尝试过使用CAST,CONVERT。试图写下如下查询:

UPDATE Table
SET month_id = SUBSTRING(CAST(month_id as VARCHAR(10)), 1, 4) +3 
WHERE month_id = '202011'

它给出结果为2023.不是202311.后来我尝试了CONCAT,但它给出算术错误。有人可以建议一个合适的解决方案?

也与另一列day_desc(datatype - nchar [10])相同,值类似于01.01.2012,01.01.2013等...此处也需要更改年份。但由于数据格式不同,我无法做到。

sql-server sql-server-2008
3个回答
0
投票

这个怎么样:

UPDATE Table
SET  month_id = month_id + 300

0
投票

这将无需您进行任何铸造即可工作......

UPDATE Table
SET month_id = (((month_id / 100) + 3) * 100) + (month_id % 100)


--(month_id / 100) will return the year part
--(month_id % 100) will return the month part

0
投票

这应该工作

UPDATE Table
SET month_id = CONCAT( CAST(LEFT(month_id, 4) + 3 AS NVARCHAR(4)), RIGHT(month_id, 2))
WHERE month_id = '202011'

根据您的评论进行编辑,输入如'01 .01.2014':

UPDATE MyTable
SET MyColumn = CONCAT(LEFT(MyValue, 6), CONVERT(INT, RIGHT(MyValue, 4))+3)
WHERE MyColumn = '01.01.2014'

Edit2,根据您对其他帖子的评论:如果您的目标是避免对同一记录进行多次更新,请假设您已经将201401更新为201701并且您不希望您的查询使其成为202001,因此您需要更新其他一些列,例如UPDATED BIT,其中1 =已经更新,0 =未更新。 更多,小心where子句:你真的想用新的逻辑(增加3年)更新你的所有表记录,或者你可能只想看其中的一些。

© www.soinside.com 2019 - 2024. All rights reserved.