Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Добрый день. При добавлении в case условия "and datediff(hour,'00:00:00', r.FactualTime) <= t.[Hours]" Процедура выдает сообщение об ошибке "Error converting data type varchar to numeric.". Что делаю не так?

Фрагмент запроса:

select top 1
@result =
case
when t.TariffType = 'С' and datediff(hour,'00:00:00', r.FactualTime) <= t.[Hours] then Price * (select
count(r1.requestid)
from Requests r1
inner join Vehicles v1 on r1.Vehicle_VehicleId = v1.VehicleId
inner join RequestStatuses rs1 on r1.RequestId = rs1.Request_RequestId
where r1.C_Tariff_TariffId = r.C_Tariff_TariffId
and r1.Vehicle_VehicleId = r.Vehicle_VehicleId
and r1.RequestId = r.RequestId
and v1.C_TariffGrid_TariffGridId = v.C_TariffGrid_TariffGridId
and rs1.C_Status_StatusId = 9
)

else 'Неизвестный тип' end

from dbo.Requests r
inner join dbo.C_Tariffs t on t.TariffId = r.C_Tariff_TariffId
left join dbo.TariffPrices tp on tp.TariffPriceId = r.TariffPrice_TariffPriceId
left join dbo.Vehicles v on tp.C_TariffGrid_TariffGridId = v.C_TariffGrid_TariffGridId
where r.RequestId = @requestID



select 'Информация : ' + @result
3 июл 12, 13:29    [12809429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Конвертите неконвертируемую строку в дату.
Ваш кэп.
3 июл 12, 13:30    [12809438]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Гавриленко Сергей Алексеевич,

Сергей, каким образом решить
3 июл 12, 13:40    [12809533]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ильдар4
Гавриленко Сергей Алексеевич,

Сергей, каким образом решить
Не конвертить неконвертируемую строку в дату.
3 июл 12, 13:40    [12809539]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Гавриленко Сергей Алексеевич,

Как тогда сравнить значения?
3 июл 12, 13:44    [12809570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ильдар4
Гавриленко Сергей Алексеевич,

Как тогда сравнить значения?
Какие значения с какими вы сравниваете, нам предлагается угадать? Чтобы сказать как?
3 июл 12, 13:45    [12809584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Гавриленко Сергей Алексеевич,

time и smallint
3 июл 12, 13:47    [12809601]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
нуб987
Guest
какой тип имеют поля r.FactualTime и t.[Hours]?
Посмотрите, какие в них есть значения, которые невозможно конвертировать
3 июл 12, 13:50    [12809630]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
нуб987,

FactualTime - тип time и t.[Hours] - тип smallint
3 июл 12, 13:52    [12809652]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ильдар4
нуб987,

FactualTime - тип time и t.[Hours] - тип smallint
Просто
select datediff(hour,'00:00:00', r.FactualTime) from <то, что у Вас написано>
работает?
Наверно, работает. А t.TariffType какого типа?
3 июл 12, 14:01    [12809758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ильдар4
нуб987,

FactualTime - тип time и t.[Hours] - тип smallint
И как поле FactualTime соотносится с типом time, в который вы его пытаетесь конвертить, подставляя в функцию datediff?
3 июл 12, 14:01    [12809764]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Это как, простите?
автор
@result =
case when ... then Price * ....
else 'Неизвестный тип' end
3 июл 12, 14:04    [12809797]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
нуб987
Guest
pkarklin
Это как, простите?
автор
@result =
case when ... then Price * ....
else 'Неизвестный тип' end

кстати, вот да
возможно при добавлении сабжевого условия у вас срабатывает то, что после else. Отсюда и ошибка. Т.е. виновато не поле r.FactualTime или t.[Hours], а значение 'Неизвестный тип', которое передается в @result
у вас @result какой тип имеет?
3 июл 12, 14:10    [12809838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
нуб987,

кстати, вот да
возможно при добавлении сабжевого условия у вас срабатывает то, что после else. Отсюда и ошибка. Т.е. виновато не поле r.FactualTime или t.[Hours], а значение 'Неизвестный тип', которое передается в @result
у вас @result какой тип имеет?


@result - nvarchar
3 июл 12, 14:14    [12809863]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
нуб987,

так работает

declare @Price decimal(18,2)
declare @FactualTime time(7)
declare @TariffType nchar(1)
declare @Hours smallint
declare @result nvarchar(256)

set @FactualTime = '08:00:00.0000000'
set @Price = 2484.76
set @TariffType = 'С'
set @Hours = 8

select top 1
@result =
case
when @TariffType = 'С' and datediff(hour,'00:00:00', @FactualTime) <= @Hours then @Price * 1
end
select 'Информация ' + @result
3 июл 12, 14:15    [12809872]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ильдар4
нуб987,

кстати, вот да
возможно при добавлении сабжевого условия у вас срабатывает то, что после else. Отсюда и ошибка. Т.е. виновато не поле r.FactualTime или t.[Hours], а значение 'Неизвестный тип', которое передается в @result
у вас @result какой тип имеет?


@result - nvarchar
До @result дело не дойдет, отвалится раньше. Надо так:

@result = 
case 
when t.TariffType = 'С' and datediff(hour,'00:00:00', r.FactualTime) <= t.[Hours] then cast ( Price * (select 
count(r1.requestid) 
from Requests r1
inner join Vehicles v1 on r1.Vehicle_VehicleId = v1.VehicleId
inner join RequestStatuses rs1 on r1.RequestId = rs1.Request_RequestId
where r1.C_Tariff_TariffId = r.C_Tariff_TariffId
and r1.Vehicle_VehicleId = r.Vehicle_VehicleId
and r1.RequestId = r.RequestId
and v1.C_TariffGrid_TariffGridId = v.C_TariffGrid_TariffGridId
and rs1.C_Status_StatusId = 9
) as nvarchar (...) )

else 'Неизвестный тип' end
3 июл 12, 14:16    [12809877]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
нуб987,

Кстати Вы оказали правы
3 июл 12, 14:16    [12809881]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Гавриленко Сергей Алексеевич,

Спасибо
3 июл 12, 14:18    [12809899]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
ильдар4,

Вам не нужен здесь CASE, ибо CASE не может вернуть разный тип данных в зависимости от того, какая его часть сработала. Проверяйте тип и используйте IF. Так же непонятно наличие TOP 1 без ORDER BY.
3 июл 12, 14:18    [12809902]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
Всем спасибо, тему можно закрывать
3 июл 12, 14:18    [12809906]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
нуб987
Guest
ильдар4
Всем спасибо, тему можно закрывать

так что в итоге было-то? Какой из вариантов оказался правильным?
3 июл 12, 14:21    [12809932]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с case  [new]
ильдар4
Member

Откуда:
Сообщений: 135
нуб987,

Вариант, Гавриленко Сергея
3 июл 12, 14:25    [12809970]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить