#sql #sql-server #sql-server-2008
#sql #sql-сервер #sql-server-2008
Вопрос:
Я использую SQL Server 2008 в этом решении.
У меня есть таблица tbltrans:
ID money datepay (nvarchar(20))
1 10 21/10/2016
Команда обновления SQL:
UPDATE dbo.tbltrans
SET money=0
WHERE RIGHT(datepay, 7) = '10' AND RIGHT(datepay, 4) = '2016'
эта команда не возвращает никакой ошибки и не обновляет столбец money.
пожалуйста, помогите исправить или любое решение аналогично.
Спасибо!
Комментарии:
1. Потому что ваша инструкция update не нашла эту запись. Дважды проверьте, что делает выполнение RIGHT (datepay, 7). Я думаю, вы обнаружите, что он возвращает не просто две цифры.
Ответ №1:
Используйте convert, чтобы получить datepay в качестве даты
Update dbo.tbltrans
Set money=0
Where Convert(Date,datepay,103) = '2016-10-21'
Комментарии:
1. Основываясь на исходном запросе, я думаю, что OP хочет обновлять только любые записи, где месяц = 10 и год = 2016
2. да, я хочу обновить только var месяц и var год. Спасибо
Ответ №2:
РЕДАКТИРОВАТЬ: Смотрите ответ Джона Каппеллетти выше, преобразование этого текста в ДАТУ упростит все.
Да, вам пришлось бы использовать своего рода подстроку для разбора этого текста. Вы можете проверить, что он не выполняет то, что вы хотели бы, при базовом ВЫБОРЕ:
SELECT TOP 100 RIGHT(datepay, 7), RIGHT(datepay, 4) FROM dbo.tbltrans
Если это поле даты, функции даты будут делать то, что вы хотите:
UPDATE dbo.tbltrans
SET money=0
WHERE MONTH(datepay) = 10 AND YEAR(datepay) = 2016
Если это не ДАТА, возможно, вам придется сначала выполнить ПРИВЕДЕНИЕ / ПРЕОБРАЗОВАНИЕ:
UPDATE dbo.tbltrans
SET money=0
WHERE MONTH(CONVERT(DATE,datepay,103)) = 10 AND YEAR(CONVERT(DATE,datepay,103)) = 2016
Комментарии:
1. спасибо за ваш ответ. Это решило проблему для моего проекта с помощью
WHERE MONTH(CONVERT(DATE,datepay,103)) = 10 AND YEAR(CONVERT(DATE,datepay,103)) = 2016
Ответ №3:
Предполагая, что datepay
это DATE
тип, вы могли бы переписать его на этот:
UPDATE dbo.tbltrans
SET money=0
WHERE MONTH(datepay) = 10 AND YEAR(datepay) = 2016
Причина, по которой ваш запрос не дает никаких результатов, заключается в вашем WHERE
заявлении, которое вы произносите RIGHT(datepay,7)
, которое возвращает 7 символов справа, в данном случае это было бы 10/2016
не 10
так, что ваш запрос должен быть:
UPDATE dbo.tbltrans
SET money=0
WHERE RIGHT(datepay, 7) = '10/2016'
Ответ №4:
В случае, если datepay
это строка, выражение RIGHT(datepay,7)
вернет ’10/2016′. Чтобы получить только ’10’, вы должны использовать SUBSTRING(datepay,4,2)
Комментарии:
1. спасибо, это ошибка, которую я исправляю
WHERE SUBSTRING(datepay,3,2) = '10' AND SUBSTRING(datepay, 7, 4) = '2016'
, но не возвращаю ошибку и не обновляю.2. извините за мою ошибку, это должна быть SUBSTRING (datepay, 4, 2)