#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 в afloat
из-за порядка приоритета типа данных. Отлично. Но почему вы преобразуете140
вfloat
, а затем преобразуете результат в adecimal
? Я вообще не вижу смысла использовать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)