এসকিউএল সার্ভারে দশমিক স্থানগুলি কাটা (গোল নয়)


194

আমি গোল না করে এসকিউএলে অতিরিক্ত দশমিক স্থানগুলি ছাঁটাই বা ফেলে দেওয়ার সর্বোত্তম উপায় নির্ধারণ করার চেষ্টা করছি। উদাহরণ স্বরূপ:

declare @value decimal(18,2)

set @value = 123.456

এটি স্বয়ংক্রিয়ভাবে @valueহয়ে উঠবে 123.46, যা বেশিরভাগ ক্ষেত্রেই ভাল। তবে, এই প্রকল্পের জন্য, আমার এটির দরকার নেই। আমার যে দশমিকের দরকার নেই তা কেটে দেওয়ার কোনও সহজ উপায় আছে? আমি জানি আমি left()ফাংশনটি ব্যবহার করতে পারি এবং দশমিকটিতে ফিরে রূপান্তর করতে পারি । অন্য কোন উপায় আছে?

উত্তর:


188
select round(123.456, 2, 1)

27
উত্তরের ক্রিয়াটির পরামিতিগুলি কী তা ব্যাখ্যা করা উচিত
টাইলার

9
এসকিউএল রাউন্ড (সংখ্যা, দশমিক, ক্রিয়াকলাপ): ক্রিয়াকলাপ -> যদি 0 হয়, তবে ফলাফলটি দশমিকের সংখ্যাকে গোল করে। যদি 0 এর চেয়ে অন্য মান হয় তবে এটি ফলাফলকে দশমিকের সংখ্যায় ছিন্ন করে। ডিফল্ট 0
মিডহুন দারভিন

আপনি জীবন রক্ষাকারী, আমার কাছে শেষ দুটি অঙ্ক কেবল "1.9991666" দেখানোর পরিমাণ ছিল, তবে এটি সর্বদা 2 এর চেয়ে বেশি হয় আমি যাই ব্যবহার করি না কেন, এর সাহায্যে আমি এই জাতীয় কিছু অর্জন করতে সক্ষম হলাম - ফর্ম্যাট নির্বাচন করুন (গোলাকার (1.9991666) , 2, 1), 'এন 2') এএস 'রেট', ধন্যবাদ সাথী
স্পাইডার

269
ROUND ( 123.456 , 2 , 1 )

যখন তৃতীয় প্যারামিটার ! = 0 এটি রাউন্ডের পরিবর্তে কেটে যায়

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

বাক্য গঠন

ROUND ( numeric_expression , length [ ,function ] )

যুক্তি

  • numeric_expression বিট ডেটা টাইপ ব্যতীত সঠিক সংখ্যা বা আনুমানিক সংখ্যার উপাত্ত টাইপ বিভাগের একটি অভিব্যক্তি।

  • length সংখ্যাসূচক-এক্সপ্রেসনকে বৃত্তাকার করার জন্য নির্ভুলতা। দৈর্ঘ্য অবশ্যই ক্ষুদ্রাকৃতি, ক্ষুদ্রকায় বা অন্তর্নিহিত টাইপের একটি অভিব্যক্তি হতে হবে। যখন দৈর্ঘ্যটি একটি ধনাত্মক সংখ্যা হয়, দৈর্ঘ্য অনুসারে নির্দিষ্ট দশমিক অবস্থানের সংখ্যায় সংখ্যাসূচক এক্সপ্রেসনটি বৃত্তাকার হয়। যখন দৈর্ঘ্য একটি negativeণাত্মক সংখ্যা হয়, দৈর্ঘ্য দ্বারা নির্দিষ্ট করা হিসাবে দশমিক পয়েন্টের বাম দিকে সংখ্যাযুক্ত এক্সপ্রেসনকে বৃত্তাকার করা হয়।

  • function কর্ম সঞ্চালনের ধরণ। ফাংশনটি অবশ্যই ক্ষুদ্রকণা, ছোট বা অন্তর্নিহিত হতে হবে। যখন ফাংশনটি বাদ দেওয়া হয় বা তার মান 0 (ডিফল্ট) থাকে, তখন সংখ্যাগত এক্সপ্রেসনটি বৃত্তাকার হয়। 0 টির চেয়ে অন্য মান নির্দিষ্ট করা হলে, সংখ্যাসূচক_প্রকাশটি কেটে যায়।

যে কেউ জানেন যে ফাংশন আর্গুমেন্টের জন্য কি মানগুলি ক্ষুদ্রকণা, ক্ষুদ্রকোণ এবং ইন্টের সাথে মিল? মাইক্রোসফ্ট সেই অংশটি তাদের ডকুমেন্টেশনের বাইরে রেখে দিয়েছে এবং উত্তর কোথাও খুঁজে পাচ্ছে না। msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
ডেভ

এম এস এসকিউএল সার্ভার নম্বরগুলি আইকিউর চেয়ে কিছুটা আলাদা করে দেয়। এই রাউন্ডের মতো রাউন্ড (x, y, z) ফাংশনটি ঠিক করতে (Val1 / val2,4,1)
ওয়ারেন


13

এখানে আমি যেভাবে কাটতে পেরেছি এবং গোলটি করতে সক্ষম হয়েছিল তা এখানে:

select 100.0019-(100.0019%.001)

100.0010 প্রদান করে

এবং আপনার উদাহরণ:

select 123.456-(123.456%.001)

123.450 প্রদান করে

এখন আপনি যদি শেষের শূন্য থেকে মুক্তি পেতে চান তবে কেবল এটিকে নিক্ষেপ করুন:

select cast((123.456-(123.456%.001)) as decimal (18,2))

123.45 প্রদান করে


10

আসলে তৃতীয় প্যারামিটারটি 0 বা 1 বা 2 যাই হোক না কেন এটি আপনার মানকে গোল করে না round

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

আমি এই উত্তর বুঝতে পারি না। প্রদত্ত এসকিউএল 10.01-এ ফলাফল যা 10.0055 থেকে দুটি দশমিক স্থানে সঠিক রাউন্ডিং। যদি চূড়ান্ত প্যারামিটার 0 না হয় তবে মানটি কেটে (2 দশমিক স্থানে) থেকে 10.00 করা হয়।
8128

7

রাউন্ডে একটি alচ্ছিক প্যারামিটার রয়েছে

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
রাউন্ড নির্বাচন করুন (123.456, 2, 1) হবে = 123.450
বিক্রম

4
আমি কেন দেখছি না কেন এটি উপবিষ্ট হয়। উপরেরটি আপনাকে যথাক্রমে 123.450 এবং 123.460 দেবে।
রেমেকারেম

7

আপনি দশমিক চান বা না চান?

যদি না হয়, ব্যবহার করুন

select ceiling(@value),floor(@value)

আপনি যদি 0 দিয়ে এটি করেন তবে একটি বৃত্তাকার করুন:

select round(@value,2)

1
দুঃখিত আমি যদি স্পষ্ট না হয়ে থাকতাম তবে আমার দশমিক স্থানগুলি রাখা দরকার, কেবল যেগুলি আমি চাই না সেগুলি ফেলে দিন drop উদাহরণস্বরূপ, উপরোক্ত আমার উদাহরণে 123.456 এর পরিবর্তে 123.46 এ রূপান্তরিত হচ্ছে ... আমি তৃতীয় দশমিকটি ফেলে রেখে এটিকে 123.45 করতে চাই।
রায়ান ইস্টব্রুক

6

গোলাকার সমাধান এবং উদাহরণ না দিয়ে অন্য একটি কাটা কাটা।

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

2
+1 Floor()যার জন্য দশমিক সংখ্যা ছাড়াই যাবার উপায়টি সত্যিকার অর্থে গোল না করে। খুব খারাপ তল () এর কোন অবস্থানের নির্দেশ করার জন্য দ্বিতীয় প্যারামিটার নেই। তবে আমি মনে করি * 10) / 10 এটি প্রায় পুরোপুরি কার্যকর হয়।
ডার্বি

4

এটি যে কোনও সংখ্যার দশমিক অংশ সরিয়ে ফেলবে

SELECT ROUND(@val,0,1)

2
এটা না. রাউন্ডটি নির্বাচন করুন (123.4560,0,1) এর পরিবর্তে আপনাকে 123.0000 দেয়।
রেমেকারেম

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

দশমিক বিন্দুর পরে আপনাকে 2 টি মান দেবে। (এমএস এসকিউএল সার্ভার)


1

অন্য উপায় ODBC TRUNCATEফাংশন:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

আউটপুট:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

মন্তব্য:

আমি ROUND3 য় প্যারামিটার সেট করে 1 এ বিল্ট-ইন ফাংশনটি ব্যবহার করার পরামর্শ দিচ্ছি ।


1
ওডিবিসি স্কেলারের কাজ - বিভিন্ন বিকল্প!
অরুলমৌজি

1

আমি জানি এটি বেশ দেরি হয়ে গেছে তবে আমি এটিকে উত্তর হিসাবে দেখছি না এবং বহু বছর ধরে এই কৌশলটি ব্যবহার করে আসছি।

আপনার মান থেকে কেবল .005 বিয়োগ করুন এবং রাউন্ড (@ num, 2) ব্যবহার করুন।

আপনার উদাহরণ:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123.45 প্রদান করে

এটি স্বয়ংক্রিয়ভাবে আপনার সন্ধান করা সঠিক মানটির সাথে রাউন্ডিং সামঞ্জস্য করবে।

যাইহোক, আপনি অফিস স্পেস চলচ্চিত্র থেকে প্রোগ্রামটি পুনরায় তৈরি করছেন?


0

বিন্দুটিকে 2 দশমিক স্থানে রূপান্তর করার জন্য দয়া করে এই কোডটি ব্যবহার করার চেষ্টা করুন:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

আউটপুট 123.46


1) তৃতীয় লাইন সম্পূর্ণ অপ্রয়োজনীয় 2) তিনি স্পষ্টভাবে বলেছিলেন যে তিনি সংখ্যাটি গোল করতে চান না, তবে এটি কেটে ফেলুন (ফলাফলটি 123.45 হওয়া উচিত)
ডামিয়ান পাবলো গঞ্জলেজ

0

আমি মনে করি আপনি কেবল দশমিক মান চান, এক্ষেত্রে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

0

আমি জানি এই প্রশ্নটি আসলেই পুরানো তবে কেউ উপ-স্ট্রিংগুলি গোল করতে ব্যবহার করেনি। এটি সুবিধার হিসাবে সত্যই দীর্ঘ সংখ্যার গোল করার ক্ষমতা (এসকিউএল সার্ভারে আপনার স্ট্রিংয়ের সীমা যা সাধারণত 8000 অক্ষর হয়):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

আমি মনে করি হ্যাকাররেঙ্কে পাওয়া সরল উদাহরণ সমাধানের সাহায্যে আমরা আরও সহজভাবে যেতে পারি:

সমস্যার বিবৃতি: স্টেশনের কাছ থেকে উত্তর অক্ষাংশের (এলএএএনএন) সর্বাধিক মান জিজ্ঞাসা করুন যা 137.2345 এর চেয়ে কম। 4 টি দশমিক স্থানে আপনার উত্তর কেটে দিন।

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

উপরের সমাধানটি আপনাকে কীভাবে 4 ডেসিমাল পয়েন্টের মধ্যে সীমাবদ্ধ করে সীমাবদ্ধ করতে হয় তার ধারণা দেয়। দশমিকের পরে যদি আপনি সংখ্যাগুলি কম বা উচ্চতর করতে চান তবে আপনি যা চান 4 তে পরিবর্তন করুন।



-5
select convert(int,@value)

1
ওপি এটি চেয়েছিল না। তিনি এখনও দশমিক জায়গাগুলি চান তবে সেগুলি গোল করার চেয়ে সেগুলি (ট্র্যাঙ্কট) সরিয়ে ফেলতে চায়। আইই 123.456 -> 123.45 নন 123.456 -> 12.46 এবং নয় 123.456 -> 123
জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.