2010-02-17 3 views
3

с помощью SQL Server 2000Обновление года?

Дата столбца Тип данных VARCHAR

Table1

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 января по 03 февраля, в год показывало неправильно для всех идентификаторов

Я хочу обновить год только 2010 вместо 2009 года, как 20100127 вместо 20000127

Ожидаемое Ouput

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'? –

+0

@Christian - Нет, это варчар? – Gopal

+0

Извините, я вас не понимаю. Является ли тип данных столбца «Дата» в вашей таблице определяемым как «datetime» или «varchar»? –

ответ

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, установленный год, где дата между 20090126 и 20090203. – Gopal

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 (20 сентября 2009 г.) в ' 20102010 '- не обязательно, что вы ожидаете/хотите. –

+0

@marc_s, очень хорошая точка. Я обновил свой ответ, чтобы добавить дополнительное предложение, которое должно справиться с этим сценарием. –

0

Если столбец определен как varchar:

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

Если столбец определен как datetime:

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'} 

Примечания:

  • Хотя синтаксис {d'yyyy-mm-dd'} не является законным T-SQL, тем не менее, перехватывается и интерпретируется правильно любым стеком клиента SQL Server, например. ODBC, OLEDB, ADO.NET и т. Д. Это также относится к интерактивным инструментам запросов. Если вам не нравится использовать escape-последовательности ODBC, вместо этого вы можете использовать convert(datetime, 'yyyy-mm-dd', 120).
  • convert(datetime, 'yyyy-mm-dd', 120) применяет формат стандарта DATETIME ODBC, который является культура/языковой инвариант, и поэтому очень полезно для построения строки даты-времени, независимо от текущей локали сервера.
1

Лучший подход, позволяет избежать замены 20 сентября

UPDATE Table1 Set Date = Replace(Date, '2009', '2010') WHERE DATE LIKE '2009%' 
Смежные вопросы