#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
У меня есть два поля в таблице, одно поле varchar, в котором сохраняются такие значения, как 3, 4, 11 или NULL, что переводится в 3, 4 или 11 лет.
Недавно я ввел новый столбец в той же таблице типа date, где я сохраняю даты и который в конечном итоге заменит предыдущее поле.
Это фактические столбцы:
Итак, для нового поля LeaseRemainingFirstBreakDate я хочу сделать GETDATE() значение в поле LeaseRemainingFirstBreak, если оно не равно null.
Комментарии:
1. Вы использовали DATEADD ?
2. Что-то вроде этого DATEADD(гггг,LeaseRemainingFirstBreak,GETDATE()) Я полагаю?
3. Да, вам нужно обработать NULL для второго параметра
4. Можете ли вы привести мне пример, пожалуйста, как обрабатывать NULL, а также спасибо
5. попробуйте это
SELECT DATEADD(yyyy, COALESCE(LeaseRemainingFirstBreak,0), GETDATE())
Ответ №1:
UPDATE [tablename]
SET [LeaseRemainingFirstBreakDate] = dateadd(year, [LeaseRemainingFirstBreak], convert(date, getDate())
where [LeaseRemainingFirstBreakDate] is not null
Преобразование гарантирует, что формат соответствует формату даты, указанному в других значениях в этом поле.
Комментарии:
1. зачем вам это нужно
CONVERT
GETDATE()
?2. В противном случае он вернет часы / минуты / секунды — просто в соответствии с соглашением об именовании существующих дат, показанных в примере.
3. Получение этого аргумента ошибки типа данных nvarchar недопустимо для аргумента 2 функции dateadd.
4. Поле LeaseRemainingFirstBreak должно быть целым числом.
Ответ №2:
С двусмысленностью в вопросе,
Если вы хотите игнорировать нули и обновлять другие строки,
UPDATE YourTable
SET LeaseRemainingFirstBreakDate = DATEADD(yyyy, CONVERT(INT, LeaseRemainingFirstBreak), GETDATE())
WHERE LeaseRemainingFirstBreak IS NOT NULL
Если вы хотите учитывать текущую дату для тех, у кого значения NULL,
UPDATE YourTable
SET LeaseRemainingFirstBreakDate = DATEADD(yyyy, CONVERT(INT, COALESCE(LeaseRemainingFirstBreak,0)), GETDATE())
Ответ №3:
С помощью DATEADD
функции Using.
Пример:
Create table Test (LeaseRemainingFirstBreakDate int ,LeaseRemainingFirstBreak datetime )
Go
Insert into Test (LeaseRemainingFirstBreakDate ,LeaseRemainingFirstBreak )
Values (2, null),
(12, null),
(22, null),
(Null, null),
(Null, null)
GO
Select * from Test
Результат:
Update Test
Set LeaseRemainingFirstBreak = DATEADD(YEAR,LeaseRemainingFirstBreakDate,getDate())
where LeaseRemainingFirstBreakDate is Not NULL
Результат:
Примечание: я исключил строки, которые имеют значение NULL при обновлении с помощью
where LeaseRemainingFirstBreakDate is Not NULL
ЕСЛИ вы хотите обновить другие нулевые строки, измените значение Null с помощью
ISNULL
или COLLASE
функции.