2010-02-17 45 views
3

使用SQL Server 2000更新年份?

日期列數據類型爲varchar

表1

ID Date 

01 20100122 
01 2010
01 20100124 
01 20100125 
01 20100126 
01 20090127 
01 20090128 
01 20090129 
01 20090130 
01 20090131 
01 20090201 
01 20100202 
01 20090203 
01 20100204 
01 20100205 
02 
..... 

從上面的表格,從一月26日至2月3日,今年是顯示錯誤的所有ID的

我想只更新2010年而不是2009年,比如20100127而不是20000127

預計輸出繼電器

ID Date 

01 20100126 
01 20100127 
... 
01 20100203 
... 
02 

查詢像

update table1 set 2010 instead of 2009 where date between 20090126 and 20090203 

如何使更新值的查詢。

需要查詢幫助

+1

是你的日期存儲爲'datetime'或'varchar'? – 2010-02-17 10:13:29

+0

@Christian - No是一個varchar? – Gopal 2010-02-17 10:15:02

+0

對不起,我不瞭解你。您表中「Date」列的數據類型是否定義爲「datetime」或「varchar」? – 2010-02-17 10:17:49

回答

1

如果列是DateTime類型看看DATEADD

SELECT GETDATE(), DATEADD(year, 1, GETDATE()) 

對於VARCHAR,你可以嘗試像

DECLARE @Table TABLE(
     Date VARCHAR(8) 
) 

INSERT INTO @Table SELECT '20090301' 

SELECT * 
FROM @Table 

UPDATE @Table 
SET  Date = '2010' + RIGHT(Date, 4) 
WHERE LEFT(Date,4) = '2009' 

SELECT * 
FROM @Table 

或類似的東西

DECLARE @Table TABLE(
     ID VARCHAR(4), 
     Date VARCHAR(8) 
) 

INSERT INTO @Table SELECT '01','20100122' 
INSERT INTO @Table SELECT '01','20100123' 
INSERT INTO @Table SELECT '01','20100124' 
INSERT INTO @Table SELECT '01','20100125' 
INSERT INTO @Table SELECT '01','20100126' 
INSERT INTO @Table SELECT '01','20090127' 
INSERT INTO @Table SELECT '01','20090128' 
INSERT INTO @Table SELECT '01','20090129' 
INSERT INTO @Table SELECT '01','20090130' 
INSERT INTO @Table SELECT '01','20090131' 
INSERT INTO @Table SELECT '01','20090201' 
INSERT INTO @Table SELECT '01','20100202' 
INSERT INTO @Table SELECT '01','20090203' 
INSERT INTO @Table SELECT '01','20100204' 
INSERT INTO @Table SELECT '01','20100205' 

UPDATE @Table 
SET  Date = '2010' + RIGHT(Date, 4) 
WHERE Date >= '20090126' 
AND  Date <= '20090203' 
AND  ID = '01' 

SELECT * 
FROM @Table 
+0

@Astander - 我想創建一個條件,比如update table1 set year,其中的日期在20090126和20090203之間。 – Gopal 2010-02-17 10:18:07

1
UPDATE Table1 
SET Date = Replace(Date, '2009', '2010') 
WHERE 
    DATE LIKE '2009%' 
AND 
    convert(DATETIME, Date, 112) BETWEEN '2009-01-26 00:00:00' AND 
             '2009-02-03 23:59:59.999' 
+0

在這個具體示例中,這與此無關,但請注意,此代碼會將'20092009'(2009年9月20日) 20102010' - 不一定,你期望/想要的。 – 2010-02-17 17:18:45

+0

@marc_s,非常好的一點。我已經更新了我的答案,添加了一個應該處理這種情況的附加子句。 – 2010-02-17 20:08:13

0

如果列被定義爲varchar:如果列被定義爲datetime

update Table1 
set [Date] = '2010' + substring([Date], 5, 4) 
where [Date] between '20090126' and '20090203' 

update Table1 
set [Date] = convert(datetime, '2010-' + substring([Date], 5, 2) + '-' + substring([Date], 7, 2), 120) 
where [Date] between {d'2009-01-26'} and {d'2009-02-03'} 

注:

  • 雖然​​語法是不合法的T-SQL,它仍然被攔截和解釋正確地由任何SQL Server客戶端堆棧,例如ODBC,OLEDB,ADO.NET等。這也適用於交互式查詢工具。如果您不喜歡使用ODBC轉義序列,則可以改爲使用convert(datetime, 'yyyy-mm-dd', 120)
  • convert(datetime, 'yyyy-mm-dd', 120)應用ODBC標準日期時間格式,這是文化/語言環境不變的,因此非常有用於構建日期時間字符串,而不管當前的服務器區域設置如何。
1

一個更好的辦法,避免了更換9月20日

UPDATE Table1 Set Date = Replace(Date, '2009', '2010') WHERE DATE LIKE '2009%'