将datetime变量更改为仅变量的年份

时间:2016-01-28 23:09:39

标签: sql-server sql-server-2008

我有一个名为DOB的日期变量。我只是想更新表格,因此DOB只是DOB的年份

第一个计划是更新

  @table set @variable = convert(int, year(@variable))

或类似

  set @variable = year(@variable)

但它首先告诉我我无法将datetime转换为int

然后我试着说

DOBint = year(DOB)

等等,但我最终放弃了DOB,因为

  

Msg 5074,Level 16,State 1,Line 1
  统计数据“DOB”取决于“DOB”列。

     

Msg 4922,Level 16,State 9,Line 1   ALTER TABLE DROP COLUMN DOB失败,因为一个或多个对象访问此列。

即使这是一个数据库,我只是从服务器复制到我的机器上玩和测试。

drop statistics traveldoc.DOB 

什么都不做

select * from sys.stats where name = 'DOB'

似乎应该有一种简单的方法可以做到这一点,而无需删除/添加列然后重命名列

从日期中删除日期和月份并将其保留在同一变量上的简单方法?

我正在使用SQL Server 2008

由于

编辑: 我职能的大部分内容

DECLARE @action nvarchar(MAX);
DECLARE @table nvarchar(128);
DECLARE @variable nvarchar(MAX);

DECLARE rowCurser CURSOR FOR SELECT [Column1], Column2, Column3 FROM tempdb.dbo.DataAvailableForAnalysis;
OPEN rowCurser;
FETCH rowCurser INTO @table, @variable, @action

WHILE @@FETCH_STATUS = 0
BEGIN
SET @action = REPLACE(REPLACE(@action, '@table', @Table), '@variable', @variable);
--if OBJECT_ID(N'@table',N'U') IS NOT NULL
--BEGIN
EXECUTE(@action);FETCH rowCurser INTO @table, @variable, @action
--END
END
CLOSE rowCurser;
DEALLOCATE rowCurser;

在这种情况下,此变量的@action将是

declare @variable datetime   update @table  set @variable= DATEPART(YYYY,@variable)

更新#2:

所以我认为添加一些上下文会有所帮助 我有一个表格,其中包含某些变量/表格

的操作

,例如

create table ##actiontable
(
actionname nvarchar(max) ,
tablename nvarchar(128),
variablename nvarchar(max)
)

insert into ##test3
values ('update @table set @variable=1', 'NcsAnalytics13.dbo.ReplicationObject', 'Target' )

在这种情况下,变量target将在表NcsAnalytics13.dbo.ReplicationObject

中设置为1

我真正的## actiontable充满了针对不同变量的不同更新语句。我唯一一个无法更新的是DOB,我想从变量中删除日期和月份(这是为了消除个人身份信息)。我需要保持相同的变量名称,但很难能够创建新变量,删除旧变量,并重命名,因为由于某种原因有一些统计数据连接到DOB,我无法弄清楚,所以我不能放弃它。 / p>

3 个答案:

答案 0 :(得分:3)

你想要datepart

@variable = DATEPART(yyyy,@ Variable)

http://www.w3schools.com/sql/func_datepart.asp

Declare @variable datetime,
        @converted int,
      @converted2 datetime

Set @variable = GetDate();
Set @converted = Cast(DatePart(yyyy, @variable) as int)
Set @converted2 = Cast('1/1/' + cast(@converted as varchar) as datetime) 

select @variable;
Select @converted;
Select @converted2;

根据您的更新更新

DECLARE @action nvarchar(MAX);
DECLARE @table nvarchar(128);
DECLARE @variable datetime;

DECLARE rowCurser CURSOR FOR SELECT [Column1], Column2, Column3 FROM tempdb.dbo.DataAvailableForAnalysis;
OPEN rowCurser;
FETCH rowCurser INTO @table, @variable, @action

WHILE @@FETCH_STATUS = 0
BEGIN
SET @action = REPLACE(REPLACE(@action, '@table', @Table), '@variable', cast(DATEPART(yyyy,@variable) as varchar));
--if OBJECT_ID(N'@table',N'U') IS NOT NULL
--BEGIN
EXECUTE(@action);FETCH rowCurser INTO @table, @variable, @action
--END
END
CLOSE rowCurser;
DEALLOCATE rowCurser;

答案 1 :(得分:1)

您不能将列从date更改为int,因此首先转换为varchar,然后提取年份并再次将列更改为int。

ALTER TABLE YourTable
ALTER COLUMN DOB VARCHAR(30)

UPDATE YourTable
SET DOB = YEAR(CAST(DOB AS DATE))

--SELECT * FROM YourTable

ALTER TABLE YourTable
ALTER COLUMN DOB INT

--SELECT * FROM YourTable

答案 2 :(得分:1)

您可能只需添加一个新的计算列:

ALTER TABLE tempdb.dbo.DataAvailableForAnalysis
  ADD DobYear AS YEAR(DOB) PERSISTED;

然后您同时拥有实际的完整DOB以及DobYear