2016-01-20 70 views
1

我有一些表格的某些行的日期年份设置为1990.我想将所有这些行设置为2016.因此,例如,1990-01-06将变为2016年 - 01-06。SQL Server:使用DATEPART的设置日期

这是我到现在为止

UPDATE [tableName] 
SET recievedDate = new DateTime() 
    //where I want to make a new datetime with 2016 as the year 
WHERE DATEPART(yyyy, receivedDate) = '1990' 
    AND DATEPART(mm, receivedDate) = '01'; 

回答

3

你可以使用DATEADD26年加入1990

CREATE TABLE #tableName(receivedDate DATE); 
INSERT INTO #tableName(receivedDate) VALUES ('1990-01-06'),('1990-01-16'); 

UPDATE #tableName 
SET receivedDate = DATEADD(YEAR, 26, receivedDate) 
WHERE DATEPART(yyyy, receivedDate) = '1990' 
    AND DATEPART(mm, receivedDate) = '01'; 

SELECT * 
FROM #tableName; 

LiveDemo


的SQL Server 2012+你可以使用DATEFROMPARTS

UPDATE #tableName 
SET receivedDate = DATEFROMPARTS(2016, 
           DATEPART(mm, receivedDate), 
           DATEPART(dd, receivedDate) 
           ) 
WHERE DATEPART(yyyy, receivedDate) = '1990' 
    AND DATEPART(mm, receivedDate) = '01'; 

LiveDemo2

编辑

请即表达DATEPART(yyyy, receivedDate) = '1990'SARGable和查询优化器会跳过索引ob receivedDate(如果存在的话)。你可以使用BETWEEN>= <建议使用Gordon Linoff

+1

谢谢,工作! – user3624883

1

由于CONVERT(varchar, yourdate, 126)返回folwoing格式“2016-01-04T07:45:00”字符串的一种可以只使用如下语句:

update YourTable set 
    yourdate = CAST('2016' + substring(CONVERT(varchar, yourdate, 126), 5, 15) as datetime) 
where YEAR(yourdate) = 1990 AND MONTH(yordate) = 1 
1

正确的解决办法是增加26年为lad2025解释。但是,查询本身是更好的这样写的:

UPDATE tableName 
    SET receivedDate = DATEADD(YEAR, 26, receivedDate) 
    WHERE receivedDate >= '1990-01-01' AND 
      receivedDate < '1990-02-01'; 

该版本允许查询采取包括receivedDate作为第一列,这可能是在性能上显著改善任何指数的优势。

+0

对于SARGable查询:) – lad2025