2016-06-16 1 views
0

Я довольно новичок в SQL. Я делаю запрос с параметрами для фильтрации любых объектов, которые были отправлены более 6 месяцев назад, и (после проверки других переменных), если он был отправлен в течение последних 21 дня. Код будет работать, если я держу последнюю строку закомментирована (я покажу вам ниже), но когда я раскомментировать эту строку, код дает мне ошибку:SQLError с функцией dateadd/функциями времени

Conversion failed when converting date and/or time from character string.

Я пытался вещи и исследования, но у меня все еще есть проблемы. Ваша помощь будет принята с благодарностью. Код ниже:

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (n.LastShpd IN ('0', '') 
    and (i.OnOrder IN ('0', '') 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2))) 
+0

Почему вы разыгрываете DateTime СИМВОЛУ затем обратно в datetime2? Особенно на гораздо меньшую длину? – Pred

+2

Каков тип данных 'lastshpd'? –

+0

lastshpd - дата и время datatype –

ответ

1

Это ваш запрос:

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (n.LastShpd IN ('0', '') -- I'm assuming error occurred in this point 
    and (i.OnOrder IN ('0', '') 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2))) 

попробовать это:

FORMAT (n.LastShpd, 'd', 'en-US') in ('0','') 

После того, как вы используете FORMAT, SQL преобразует что значения в varchar. Затем вы можете применить свои строковые условия.

+0

'FORMAT' может быть недоступен в зависимости от версии SQL Server, которую использует ассер. (Это требует 2012+.) –

+0

Упс! Я не думал об этом :( –

+0

Спасибо, Марин Моханадас. Моя ошибка произошла именно в этой точке, и это поможет мне найти ошибку. Я благодарю вас за помощь. –

1

Учитывая приведение в datetime или datetime2 перед сопоставлением с i.LastShpd, я предполагаю тип данных, относящихся к дате i.LastShpd. Поэтому, я думаю, с помощью DATEDIFF вместо DATEADD упростит запрос ...

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and datediff(day, getdate(), i.LastShpd) < -180 
and (n.LastShpd IN ('0', '') 
    and (i.OnOrder IN ('0', '') 
    or datdiff(day, getdate(), i.LastShpd) < -21)) 
+0

Я по-прежнему получал ту же ошибку –

+0

Я извиняюсь, ваш Код был прав. Моя ошибка была на самом деле с типом данных n.LastShpd, но ваш код более эффективен. Спасибо за вашу помощь. –

Смежные вопросы