Не удалось выполнить преобразование при преобразовании даты из символьной строки в sql server

#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 как a varchar(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());