#sql #sql-server
Вопрос:
Declare @count varchar(max) Select @count=configurable from configurableitems where project='auto' Delete from detaillog where createdtimelt;convert(date,getdate()-@count)
Я получаю ошибку:
Ошибка преобразования при преобразовании даты и/или времени из символьной строки
Комментарии:
1. Все вышесказанное действительно не имеет никакого смысла. Вы объявляете
@Count
как avarchar(MAX)
, и пытаетесь вычесть указанное значение изGETDATE()
. Даты и строки-это совершенно разные значения. Нет смысла вычитатьvarchar
из значения значение длиной до 2 миллиардов символовdatetime
.2. Ранее мы использовали запрос типа :Удалить из подробного журнала, где createdtime
3. Этот запрос содержится в вашем вопросе, однако это не объясняет, почему вы пытаетесь ввести строку размером до 2 гигабайт из a
datetime
… Чего вы на самом деле пытаетесь здесь достичь. Даты не являются строками, они хранятся в виде двоичных значений. Сложение и вычитание из них не имеет смысла. Вместо этого, если вы хотите добавить или вычесть интервал из значения даты и времени, используйтеDATEADD
.
Ответ №1:
Как я уже упоминал в комментариях, вышесказанное не имеет большого смысла. Вычитание значения до 2 миллиардов символов varchar
из a datetime
бессмысленно. С таким именем, как @Count
это, тоже подразумевается числовое значение. Может @count
быть, следует быть int
?
Далее, добавление и вычитание по датам не имеет большого смысла. Что 2020-12-06T13:05:00:123 - 3
такое, например? Минус 3 чего? Хотя этот синтаксис работает со старыми (small)datetime
типами данных, он не работает для новых типов данных даты и времени. Если вы хотите добавить/вычесть интервалы из ваших значений даты и времени, используйте DATEADD
.
Возможно, вам нужно вот что:
DECLARE @count int; SELECT @count = configurable FROM configurableitems WHERE project = 'auto'; DELETE FROM detaillog WHERE createdtime lt; CONVERT(date, DATEADD(DAY,-@Count,GETDATE());