2016-01-20 54 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