SQL - ปัดเศษทศนิยม 2 ตำแหน่ง


222

ฉันต้องการแปลงนาทีเป็นชั่วโมงปัดเศษเป็นทศนิยม 2 ตำแหน่งและฉันต้องแสดงตัวเลขหลังจุดทศนิยมได้ไม่เกิน 2 ตัว ดังนั้นถ้าฉันมีนาทีเป็น 650 จากนั้นชั่วโมงควรเป็น 10.83

นี่คือสิ่งที่ฉันมี:

Select round(Minutes/60.0,2) from ....

แต่ในกรณีนี้ถ้านาทีของฉันคือบอกว่า 630 - ชั่วโมงคือ 10.5000000 แต่ฉันต้องการมันเป็น 10.50 เท่านั้น (หลังจากปัดเศษ) ฉันจะบรรลุสิ่งนี้ได้อย่างไร


3
คุณใช้โปรแกรมฐานข้อมูลใดอยู่
Ja͢ck

1
ถ้า T-SQL นี้เป็นซ้ำstackoverflow.com/questions/3190688/...
Cees Timmerman

คำตอบ:


378

คุณไม่สามารถแสดงผลลัพธ์เป็นnumeric(x,2)? ที่ไหนx <= 38

select 
    round(630/60.0,2), 
    cast(round(630/60.0,2) as numeric(36,2))

ผลตอบแทน

10.500000   10.50

8
แปลก. SELECT ROUND(630/60.0, 2);ให้ฉัน10.50แล้ว
Ja͢ck

4
@ u07ch จุดประสงค์ของการใช้ round () เมื่อคุณใช้งาน cast อยู่แล้ว?
ราม

16
@Ram คำถามไม่ได้ระบุเครื่องยนต์เซิร์ฟเวอร์ sql - ซึ่งเป็นเหตุผลที่ฉันเน้น cast v รอบด้วยตัวเอง การแปลงเป็นตัวเลขไม่ได้ปัดเศษในทุกเครื่องยนต์ดังนั้นหากจำนวนที่คำนวณได้คือ 10.809 คุณจะได้รับ 10.80 แทนที่จะเป็น 10.81 คำถามที่ต้องการ
u07ch

1
@ u07ch ขอบคุณสำหรับการตอบโดยละเอียด มันช่วยฉัน
ราม

8
cast(630/60.0 as numeric(36,2))is enougth10,50
MrHIDEn

78

เช่นเดียวกับ SQL Server 2012 คุณสามารถใช้ฟังก์ชั่นรูปแบบในตัว:

SELECT FORMAT(Minutes/60.0, 'N2')

(สำหรับการอ่านเพิ่มเติม ... )


2
โปรดทราบว่านี่เป็นการแนะนำตัวคั่นหลักพันเช่นกัน1,757.47
8128

10
การใช้ '0.00' แทน 'N2' จะให้ทศนิยมสองตำแหน่งโดยไม่มีตัวคั่นหลักพัน
8128

2
ดูเหมือนว่าจะแปลงเป็นสตริง? ซึ่งสกรูเรียงลำดับโดย
blissweb

2
@blissweb ไม่ควรมีปัญหาตามที่คุณสามารถสั่งซื้อในคอลัมน์เดิมไม่ใช่เอาท์พุทของฟังก์ชั่นรูปแบบ
Matten



5
CAST(QuantityLevel AS NUMERIC(18,2))

2
ยินดีต้อนรับสู่ Stack Overflow! ขอบคุณสำหรับข้อมูลโค้ดซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันที คำอธิบายที่เหมาะสมจะช่วยปรับปรุงมูลค่าในระยะยาวได้อย่างมากโดยการอธิบายว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติฐานที่คุณทำ
sepehr



3

แบบสอบถามต่อไปนี้มีประโยชน์และเรียบง่าย -

declare @floatExchRate float;
set @floatExchRate=(select convert(decimal(10, 2), 0.2548712))
select  @floatExchRate

ให้เอาต์พุตเป็น 0.25


3

สิ่งที่คุณเคยใช้ในการกำหนดควรเป็นทศนิยมตัวอย่างเช่น1548/100จะให้15.00

หากเราแทนที่100ด้วย100.0ในตัวอย่างของเราเราจะได้รับ15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0

3

แปลงหมายเลขของคุณไปหรือNumericDecimal

แทนที่แบบสอบถามของคุณด้วยสิ่งต่อไปนี้

เซิร์ฟเวอร์ SQL

Select Convert(Numeric(38, 2), Minutes/60.0) from ....

MySql:

Select Convert(Minutes/60.0, Decimal(65, 2)) from ....

Castฟังก์ชั่นเสื้อคลุมสำหรับที่Convertฟังก์ชั่น คู่ที่มี SQL เป็นภาษาตีความและผลที่ได้คือว่าถึงแม้ทั้งสองฟังก์ชั่นการผลิตผลลัพธ์ที่เหมือนกันมีมากขึ้นเล็กน้อยที่เกิดขึ้นเบื้องหลังในCastฟังก์ชั่น การใช้Convertฟังก์ชั่นเป็นการประหยัดขนาดเล็ก แต่การประหยัดขนาดเล็กทวีคูณ



2

ในฐานะที่เป็นส่วนเสริมของคำตอบด้านล่างเมื่อใช้ INT หรือประเภทข้อมูลที่ไม่ใช่ทศนิยมในสูตรของคุณอย่าลืมคูณค่าด้วย 1 และจำนวนทศนิยมที่คุณต้องการ

ie - TotalPackagesเป็นตัวส่วนINTดังนั้นTotalContainersฉันต้องการให้ผลลัพธ์ของฉันมีทศนิยมได้ถึง 6 ตำแหน่ง

ดังนี้:

((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,

1

ตัวอย่างต่อไปนี้อาจช่วยคุณได้:

select SUBSTR(ENDDTTM,1, 9), extract(DAY FROM (ENDDTTM)), ENDDTTM, BEGINDTTM,  (ENDDTTM - BEGINDTTM),substr(BEGINDTTM, 1,15), substr((ENDDTTM - BEGINDTTM), 12, 8),
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 3600 + substr((ENDDTTM - BEGINDTTM), 15, 2)*60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)),2) as seconds,
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 60 + substr((ENDDTTM - BEGINDTTM), 15, 2) +  substr((ENDDTTM - BEGINDTTM), 18, 2)/60 ), 2)as minutes,
round((substr((ENDDTTM - BEGINDTTM), 12, 2) + substr((ENDDTTM - BEGINDTTM), 15, 2)/60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)/3600 ),2)  as hours

0

ฉันพบว่าฟังก์ชัน STR เป็นวิธีที่สะอาดที่สุดในการทำสิ่งนี้ให้สำเร็จ

SELECT STR(ceiling(123.415432875), 6, 2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.