将类型定义为变量 - DATEADD(类型,值,日期) - SQL

时间:2016-01-05 22:22:32

标签: sql sql-server tsql

我不得不在我的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。它更像是一个基于知识的问题 - 它没有阻止我,我只是想知道它是否可能。

谢谢! :)

2 个答案:

答案 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