SQL Обновить запрос для замены последних 4 символов в столбце - PullRequest
1 голос
/ 07 февраля 2020

Мне нужно заменить последние четыре символа в столбце. В настоящее время это год в формате char, и мне нужно заменить его текущим годом. Код, который я использую сейчас, успешно удаляет старый год, но не может ввести необходимый новый год.

Мой текущий код:

DECLARE @NewYear as Char
SELECT @NewYear = cast(YEAR(GETDATE()) as char(4))

UPDATE MyTable
SET ENDDATE = (substring(ENDDATE, -5, len(ENDDATE)) +@NewYear)
WHERE EndDate < StartDate

Исходное значение - 01/01 / 2017 Результат - 01/01 / Требуемый результат - 01/01/2020

Используется в SAS Pro c SQl сквозной - стандарт ANSI SQL

Любой помощь будет оценена. Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

В объявлении вашей переменной есть проблема. Он должен быть объявлен как char(4) - в противном случае по умолчанию он равен char(1) и заканчивается значением '2' instea 2020.

Также вы можете использовать left вместо o подстроки

Вот один из способов сделать это:

DECLARE @NewYear as Char(4)
SELECT @NewYear = CAST(YEAR(GETDATE()) as char(4))

UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + @NewYear
WHERE EndDate < StartDate

Обратите внимание, что использование переменной здесь дает мало преимуществ. Весьма вероятно, что база данных оптимизирует выражение и не будет выполнять вычисления на основе getdate() для каждой строки.

UPDATE MyTable
SET ENDDATE = LEFT(ENDDATE , len(ENDDATE) - 4) + cast(YEAR(GETDATE()) as char(4))
WHERE EndDate < StartDate
0 голосов
/ 07 февраля 2020

Я бы предложил:

UPDATE MyTable
    SET ENDDATE = STUFF(ENDDATE, 7, 4, DATENAME(year, GETDATE()))
    WHERE EndDate < StartDate;

Предложение WHERE не имеет смысла, поскольку вы проводите сравнение дат.

Обратите внимание, что переменные здесь не помогают. Вам не нужно ничего преобразовывать в строку, если вы используете DATENAME(), потому что она возвращает строку.

Я подумал, что они могут быть сохранены как даты, но вы никогда не получите 01/01/ как действительная дата.

...