Как мне преобразовать минуты в десятичное представление часов в sql?

#sql #time #casting

#sql #время #Кастинг

Вопрос:

У меня 140 минут. Которое в часах и минутах становится 2:20.

В этом случае я хотел бы получить 2.33.

Что я пробовал:

 select cast(140/60 as varchar(8))   '.'   cast((140 % 60) as varchar(8))
  

Результаты: 2.20

 select 140/60
  

Результаты: 2

 select cast(140/60 as decimal(5,2))
  

Результаты: 2.00

Чего мне не хватает?

Как мне преобразовать 140 минут в десятичное представление часов?

Комментарии:

1. вы также должны преобразовать 140 и 60 в float, выберите cast(140 как float) / cast(60 как float)

2. select case(140/60 as decimal(5,2)) возвращает 2.33 просто отлично для меня…

3. @hoangnnm Спасибо, это сработало! выберите приведение (приведение (140 как число с плавающей запятой) / приведение (60 как число с плавающей запятой) как десятичное (5,2))

4. 60 не обязательно должно быть с плавающей точкой, попробуйте приведенный ниже код

5. И причина, по которой вы не получаете напрямую, заключается в том, что он принимает тип данных числителя. Вы можете попробовать второй запрос без преобразования какого-либо числа в число с плавающей запятой.

Ответ №1:

Извините за быстрый комментарий, я попытаюсь объяснить это немного более четко.

По умолчанию Sql будет «думать», что оба ваших dividend amp; divisor имеют тип данных INT, поэтому он возвращает 2.

Если вы укажете число с десятичной дробью, например :

 select (140.00/60.00)
  

теперь тип данных больше не int, и результат: 2.3333333

Итак, вам нужно будет преобразовать один из типов данных в float, decimal, numeric (n, n), чтобы получить точный результат :

 select cast(140 as decimal(5, 2)) / cast(60 as decimal(5, 2)) 
  

Но вы все равно можете просто преобразовать только делитель или делитель, например :

 select 140 / cast(60 as decimal(5, 2)) 
  

или

 select cast(140 as decimal(5, 2)) / 60
  

они оба дали одинаковый результат, потому что тип результата — это тип данных аргумента с более высоким приоритетом, в данном случае decimal имеет более высокий приоритет, чем int

вы можете прочитать больше здесь :

Ответ №2:

Попробуйте это

 Select convert(decimal(5,2),convert(float,140)/60)
  

или

 Select cast(140.00/60 as decimal(5,2))
  

Комментарии:

1. Почему вы конвертируете в float , а затем в decimal ? Конечно, оба должны быть decimal ?

2.Это другой вопрос. convert(float,140)/60 неявно вызывает преобразование 60 in в a float из-за порядка приоритета типа данных. Отлично. Но почему вы преобразуете 140 в float , а затем преобразуете результат в a decimal ? Я вообще не вижу смысла использовать float . Почему бы просто не использовать CAST(140 as DECIMAL(5,2)) / 60 ? Переключение между int float и decimal выглядит явно непоследовательным.

3. ПРИВЕДЕНИЕ (140 как ДЕСЯТИЧНОЕ (5,2)) / 60 Я считаю, что результат равен 2,333333, а не 2,33. Можете ли вы проверить себя и понять, что я это предоставил. 140 преобразуется либо в число с плавающей запятой, либо в десятичное число, тогда / 60 дает 2,333333, который снова необходимо преобразовать в десятичное число (5,2)