Как разделить столбец SQL и получить часть при условии

#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)