SQL 更新查询以替换列中的最后 4 个字符
SQL Update query to replace last 4 characters in column
我需要替换一列中的最后四个字符。
目前是 char 格式的一年,我需要替换为当前年份。
我现在使用的代码成功删除了旧年份,但未能输入所需的新年份。
我的当前代码:
DECLARE @NewYear as Char
SELECT @NewYear = cast(YEAR(GETDATE()) as char(4))
UPDATE MyTable
SET ENDDATE = (substring(ENDDATE, -5, len(ENDDATE)) +@NewYear)
WHERE EndDate < StartDate
原值 - 01/01/2017
结果 - 01/01/
期望的结果 - 01/01/2020
这正在 SAS Proc 中使用 SQl 通过 - ANSI 标准 SQL
如有任何帮助,我们将不胜感激。
谢谢!
你的变量声明有问题。它应该声明为 char(4)
- 否则它默认为 char(1)
并以值 '2'
而不是 2020
.
结束
此外,您可以使用 left
代替子字符串。
这是一种方法:
DECLARE @NewYear as Char(4)
SELECT @NewYear = CAST(YEAR(GETDATE()) as char(4))
UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + @NewYear
WHERE EndDate < StartDate
请注意,此处使用变量几乎没有什么好处。数据库很可能会优化表达式,而不是对每一行进行基于 getdate()
的计算。
UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + cast(YEAR(GETDATE()) as char(4))
WHERE EndDate < StartDate
我建议:
UPDATE MyTable
SET ENDDATE = STUFF(ENDDATE, 7, 4, DATENAME(year, GETDATE()))
WHERE EndDate < StartDate;
WHERE
子句没有意义,因为您正在进行日期比较。
请注意变量在这里没有帮助。如果您使用 DATENAME()
,则不必将任何内容转换为字符串,因为它 returns 是一个字符串。
我想了一会儿它们可能会存储为日期,但您永远不会将 01/01/
作为有效日期。
我需要替换一列中的最后四个字符。 目前是 char 格式的一年,我需要替换为当前年份。 我现在使用的代码成功删除了旧年份,但未能输入所需的新年份。
我的当前代码:
DECLARE @NewYear as Char
SELECT @NewYear = cast(YEAR(GETDATE()) as char(4))
UPDATE MyTable
SET ENDDATE = (substring(ENDDATE, -5, len(ENDDATE)) +@NewYear)
WHERE EndDate < StartDate
原值 - 01/01/2017 结果 - 01/01/ 期望的结果 - 01/01/2020
这正在 SAS Proc 中使用 SQl 通过 - ANSI 标准 SQL
如有任何帮助,我们将不胜感激。 谢谢!
你的变量声明有问题。它应该声明为 char(4)
- 否则它默认为 char(1)
并以值 '2'
而不是 2020
.
此外,您可以使用 left
代替子字符串。
这是一种方法:
DECLARE @NewYear as Char(4)
SELECT @NewYear = CAST(YEAR(GETDATE()) as char(4))
UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + @NewYear
WHERE EndDate < StartDate
请注意,此处使用变量几乎没有什么好处。数据库很可能会优化表达式,而不是对每一行进行基于 getdate()
的计算。
UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + cast(YEAR(GETDATE()) as char(4))
WHERE EndDate < StartDate
我建议:
UPDATE MyTable
SET ENDDATE = STUFF(ENDDATE, 7, 4, DATENAME(year, GETDATE()))
WHERE EndDate < StartDate;
WHERE
子句没有意义,因为您正在进行日期比较。
请注意变量在这里没有帮助。如果您使用 DATENAME()
,则不必将任何内容转换为字符串,因为它 returns 是一个字符串。
我想了一会儿它们可能会存储为日期,但您永远不会将 01/01/
作为有效日期。