我不得不在我的SQL表(datetime字段)的一列中更改日期,将YEAR增加1.执行此操作的简单方法是(除非有人知道更好的方法)更新表和SET DATEADD()
列-- Sample 2
-- Error in the code
DECLARE @type VARCHAR(10) = 'YEAR'
,@increment INT = 1
SELECT DATEADD(@type, @increment, GETDATE())
因为我是一个懒惰的程序员,所以每次遇到这种情况时我都不想继续更新表。所以我决定编写一个小脚本(函数),从用户那里获取TYPE,VALUE并执行操作。但是我遇到了一种我不能将TYPE用作变量的情况。
-- Sample 3
DECLARE @type VARCHAR(10) = 'YEAR'
,@increment INT = 1
UPDATE Table_name
SET Column_date = CASE @type WHEN 'YEAR' THEN DATEADD(YEAR, @increment, Column_date)
WHEN 'MONTH' THEN DATEADD(MONTH, @increment, Column_date)
-- and so on
END
我可以编写一个case语句,根据'TYPE'值我可以选择更新语句。
{{1}}
但有没有办法在没有case语句的情况下执行操作,或者是否有人可以使示例代码'2'运行?
P.S。它更像是一个基于知识的问题 - 它没有阻止我,我只是想知道它是否可能。
谢谢! :)
答案 0 :(得分:3)
您可以从用户那里获取所有类型值,然后立即更新所有类型值。默认为0,他们不想更改
DECLARE @Year INT = 0,
@Month INT = 0,
@Day INT = 0
UPDATE Table_name
SET Column_date = DATEADD(YEAR, @Year, DATEADD(Month, @Month, DATEADD(Day, @Day, Column_date)))
答案 1 :(得分:1)
已提供解决方案的替代方法是使用动态SQL:
<强>设定:强>
-- drop table dbo.DateTest
create table dbo.DateTest
(
TheDate DATE,
UpdatedDate DATE
)
TRUNCATE TABLE dbo.DateTest
GO
INSERT INTO dbo.DateTest (TheDate) VALUES ('20150203'), ('20150506'), ('20141231')
GO
<强>代码:强>
select * from dbo.DateTest
DECLARE @type VARCHAR(8) = 'year' -- this must be a DATEADD recognizable token
DECLARE @increment INT = 2
DECLARE @Sql NVARCHAR(1000) = N'
UPDATE dbo.DateTest SET UpdatedDate = DATEADD(' + @type + ', @increment, TheDate)'
EXEC sp_executesql @Sql, N' @increment INT', @increment
select * from dbo.DateTest
我希望日期部分可以作为参数提供,但它似乎不是possible。