Преобразование текста в число

#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, не так ли?