#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть онлайн-форма, в которой пользователь выбирает продолжительность занятия из выпадающего списка. Затем эти данные попадают в поле базы данных с именем duration — varchar(5), примером данных будет 02:30. Затем я запускаю хранимую процедуру, которая должна преобразовать данные в 2.5, что позволяет рассчитать продолжительность с почасовой оплатой.
Поля данных
Длительность — varchar(5) 02:30
Значение параметра — числовое (18,2) 2,5
Моя проблема в том, что я получаю сообщение об ошибке при запуске этой хранимой процедуры.
Ошибка преобразования типа данных varchar в real.
UPDATE
ManualAdjustments
SET
ValueOfDuration = ROUND (CONVERT(real, LEFT(Duration, 2)) (CONVERT(real,RIGHT(Duration, 2)) / 60.0),2)
WHERE ValueOfDuration IS NULL
Комментарии:
1. Какую СУБД вы используете?
2. Если вы используете Oracle, используйте TO_NUMBER вместо CONVERT .
3. отлично работает sqlserver для значения 2: 30 .. есть ли конкретное значение, для которого оно не работает?
4. Там много специфичных для продукта функций. Какую СУБД вы используете?
5. Было бы гораздо целесообразнее сначала сохранить вашу продолжительность в виде числа, а не
VARCHAR(5)
— Вредные привычки: выбор неправильного типа данных
Ответ №1:
Предполагая, что SQL Server и ваша продолжительность не превышают 59:59
Update YourTable Set ValueOfDuration = DateDiff(SS,'1900-01-01','1900-01-01 00:' Duration)/60.
В этом случае 02:30 вернет 2.5
Комментарии:
1. Ничего не происходит, не выдает ошибку, но также не обновляет поле.
2. @Alexandria Простите за глупый вопрос, но вы включили десятичную дробь после 60? 60.
3. Я не должен был этого делать?
4. @Alexandria Без десятичной дроби это INT / INT, который может легко сгенерировать ноль
5. @Alexandria — это данные «Время», выберите отличную длительность от вашего порядка в таблице на 1… Посмотрите, привлекает ли что-нибудь ваше внимание
Ответ №2:
Если база данных является SQL Server
UPDATE
ManualAdjustments
SET
ValueOfDuration= CAST(DATEDIFF(minute,'1990-1-1','1990-1-1 ' Duration)/60.0 AS NUMERIc(15,2))
WHERE ValueOfDuration IS NULL
Комментарии:
1. Нужно ли мне изменять тип данных для valueOfDuration?
2. Длительность равна varchar(5), но ValueofDuration является числовым (18.2)
3. Получение этой ошибки сейчас, ошибка преобразования при преобразовании даты и / или времени из символьной строки.
4. Длительность — varchar(5), а ValueofDuration — числовая (18,2)
5. ok Максимальное значение для ddlMinsHR. SelectedValue должно быть 59, не так ли?