ورود

View Full Version : Percent DataType



مهدی هادیان2
سه شنبه 04 بهمن 1390, 09:53 صبح
بسم الله الرحمن الرحیم
با سلام
در یک جدول ستون تخفیف دارم که به درصد است
چه نوعی باید برای آن در نظر بگیرم؟
با تشکر

Galawij
سه شنبه 04 بهمن 1390, 10:30 صبح
سلام،
چون مقدار صفر تا صد را قبول می کند می تونید براش نوع داده Tinyint را در نظر بگیرید، فقط روش قید بذارید که در این بازه مقدار بگیرد. نمونه قید:
ALTER TABLE [dbo].[TbContract] WITH CHECK ADD CONSTRAINT [CK_TbContract] CHECK (([ContractManagementPercent]>=(0) AND [ContractManagementPercent]<=(100)))

مهدی هادیان2
سه شنبه 04 بهمن 1390, 11:49 صبح
سلام،
چون مقدار صفر تا صد را قبول می کند می تونید براش نوع داده Tinyint را در نظر بگیرید، فقط روش قید بذارید که در این بازه مقدار بگیرد. نمونه قید:
ALTER TABLE [dbo].[TbContract] WITH CHECK ADD CONSTRAINT [CK_TbContract] CHECK (([ContractManagementPercent]>=(0) AND [ContractManagementPercent]<=(100)))

فروم های خارجی برای این مورد decimal(5,2) رو پیشنهاد داده بودند
به نظر شما موردی که شما فرمودید مناسب تر است یا این؟
با تشکر

Galawij
سه شنبه 04 بهمن 1390, 12:07 عصر
فروم های خارجی برای این مورد (decimal(5,2رو پیشنهاد داده بودندلطف می کنید لینکش را بذارید!
(5,2)Decimal یعنی 5 رقم با دو عدد اعشار که مثلاً عدد 300.44 را هم قبول می کند که در بازه 0 و 100 نیست.
اگر می خواید Decimal تعریف کنید باید (2,2) Decimal در نظر بگیرید که در این صورت شامل خود 100 نمی شه و تا 99% جلو می ره. دقت کنید در صورتی که از این نوع داده استفاده کنید خروجی Select را باید در 100 ضرب کنید.

مهدی هادیان2
سه شنبه 04 بهمن 1390, 13:01 عصر
لطف می کنید لینکش را بذارید!

http://stackoverflow.com/questions/2762302/sql-server-appropriate-datatype-for-holding-percent-values
http://social.msdn.microsoft.com/Forums/en/sqlgetstarted/thread/ca4f8346-89bc-44f2-811c-1b51b843a5ef
http://stackoverflow.com/questions/1602318/what-should-be-the-best-way-to-store-a-percent-value-in-sql-server
لینک های دیگه ای هم بود

Galawij
سه شنبه 04 بهمن 1390, 14:04 عصر
http://stackoverflow.com/questions/2...percent-values (http://stackoverflow.com/questions/2762302/sql-server-appropriate-datatype-for-holding-percent-values)لینک اول که (5,3)Decimalرا پیشنهاد می ده که تا عدد 99.999 را نگهداری می کنه.

http://social.msdn.microsoft.com/For...c-1b51b843a5ef (http://social.msdn.microsoft.com/Forums/en/sqlgetstarted/thread/ca4f8346-89bc-44f2-811c-1b51b843a5ef)که اصلاً احساس می کنم اشتباه هست.

http://stackoverflow.com/questions/1...-in-sql-server (http://stackoverflow.com/questions/1602318/what-should-be-the-best-way-to-store-a-percent-value-in-sql-server)اگر توضیحات این لینک را با دقت بخونید:
12 down vote accepted
decimal(p,s) (http://msdn.microsoft.com/en-us/library/ms187746.aspx) in 99.9% of cases
Percent is only a presentation concept: 10% is still 0.1
Edit: simply, decide precision and scale for the highest expected values/desired decimal places when expressed as real numbers. You can p = s for values < 100% and simply decide based on decimal places
Edit2:
However, if you do need to store 100% or 1, then you'll need p = s+1.
This then allows up to 9.xxxxxx or 9xx.xxxx%, so I'd add a check constraint to keep it maximum of 1 if this is all I need.
و در ادامه این لینک:
Note: if you know that you're not going to reach the 100% (i.e. your value will always be less than 100% than use decimal(s, s), if it will, use decimal(s+1, s).
متوجه می شید، که در صورتی که مقدار هم از حد مجاز بالا بزنه با قید کنترل می شه.
نوع داده decimal را وقتی استفاده می کنید که اعشار هم برای شما مهم باشه. مثلاً: 35.50% ولی در صورتی که مقدار اعشار برای شما مهم نیست با توجه به تفاوت حجم ذخیره سازی tinyint و decimal، بهتره که از tinyint با محدود کردن آن استفاده کنید.

مهدی هادیان2
سه شنبه 04 بهمن 1390, 14:28 عصر
متوجه می شید، که در صورتی که مقدار هم از حد مجاز بالا بزنه با قید کنترل می شه.
نوع داده decimal را وقتی استفاده می کنید که اعشار هم برای شما مهم باشه. مثلاً: 35.50% ولی در صورتی که مقدار اعشار برای شما مهم نیست با توجه به تفاوت حجم ذخیره سازی tinyint و decimal، بهتره که از tinyint با محدود کردن آن استفاده کنید.
از اینکه با دقت پیگیری می کنید تشکر می کنم
بنابر توضیحات شما چیزی در sql نداریم که دقیقا از نماد % استفاده کرده باشد
چون اگر tinyint بگیرم باید مقادیر درصد رو بدون احتساب نماد % استفاده کنم و مثلا 20% رو بنویسم 20.
درست است؟

Galawij
سه شنبه 04 بهمن 1390, 18:19 عصر
نه دوست عزیز، در SQL برای همچین نمادهایی نوع داده نداریم. شما با Decimal هم نمی تونید این کاراکتر را نگهداری کنید.

مهدی هادیان2
شنبه 08 بهمن 1390, 11:06 صبح
سلام،
چون مقدار صفر تا صد را قبول می کند می تونید براش نوع داده Tinyint را در نظر بگیرید، فقط روش قید بذارید که در این بازه مقدار بگیرد. نمونه قید:
ALTER TABLE [dbo].[TbContract] WITH CHECK ADD CONSTRAINT [CK_TbContract] CHECK (([ContractManagementPercent]>=(0) AND [ContractManagementPercent]<=(100)))

با سلام
اگه جدول هامون رو با ویزارد درست کرده باشیم نه با کدنویسی؛ چگونه می توان این شرط را در قسمت Column Properties زیر شاخه Open Table Definition اعمال کرد؟
و یک سوال دیگه اینکه آیا این قید ها را باید تنها در پایگاه داده اعمال کرد یا در فرم ها هم کاربر رو محدود کرد؟
با تشکر

یوسف زالی
شنبه 08 بهمن 1390, 12:52 عصر
مورد اول:
81596
و سوال دوم:
هیچ موقع اعتبار سنجی رو به مرحله آخر (داده) متکی نکنید.
همیشه این کار رو در UI هم انجام بدید حتی اگر در دیتابیس خیلی خوب این کار رو کرده باشید.

مهدی هادیان2
شنبه 08 بهمن 1390, 22:48 عصر
مورد اول:
81596
و سوال دوم:
هیچ موقع اعتبار سنجی رو به مرحله آخر (داده) متکی نکنید.
همیشه این کار رو در UI هم انجام بدید حتی اگر در دیتابیس خیلی خوب این کار رو کرده باشید.
از پاسختون ممنونم
کد مورد نظر رو در SP به شکل زیر نوشتم؛ کارم درسته؟

ALTER PROCEDURE dbo.SPCHECKCONSTRAINTFactorDetails
AS
/* SET NOCOUNT ON */
ALTER TABLE [dbo].[FactorDetails]
WITH CHECK ADD CONSTRAINT [CK_FactorDetails] CHECK
(([DiscountPercent]>=(0) AND [DiscountPercent]<=(100)))
RETURN

یوسف زالی
یک شنبه 09 بهمن 1390, 04:22 صبح
چرا در SP؟ نمی فهمم علتش چی بوده.
مگر شما نمی خواهی با ویزارد چک اضافه کنی؟
اون جا در Expression از General محدودیتتون رو اعمال کنید.
موفق باشید.

مهدی هادیان2
یک شنبه 09 بهمن 1390, 12:35 عصر
چرا در SP؟ نمی فهمم علتش چی بوده.
مگر شما نمی خواهی با ویزارد چک اضافه کنی؟
اون جا در Expression از General محدودیتتون رو اعمال کنید.
موفق باشید.

می خوام بدونم در حالت کلی کدوم منطقی تر است؟
اینکه برای ایجاد جداول یا اعمال قیدها و ... از ویزارد استفاده کنیم یا SP؟
با تشکر

یوسف زالی
یک شنبه 09 بهمن 1390, 14:06 عصر
من فکر می کنم که شما به اشتباه فکر می کنید اسکریپت همون SP هست.
لازم نبست هر اسکریپت تبدیل به SP بشه.

مهدی هادیان2
یک شنبه 09 بهمن 1390, 15:23 عصر
من فکر می کنم که شما به اشتباه فکر می کنید اسکریپت همون SP هست.
لازم نبست هر اسکریپت تبدیل به SP بشه.

فرض کنید من بخوام کد دستور ایجاد جدول رو بزنم در کجا باید دستور create table رو بنویسم؟

یوسف زالی
یک شنبه 09 بهمن 1390, 20:39 عصر
معذرت می خوام.
Alt + N را بزنید.
با چه ورژنی کار می کنید؟
الان همین SP رو از کجا نوشتید؟

مهدی هادیان2
دوشنبه 10 بهمن 1390, 10:22 صبح
از پاسختون ممنون.

با چه ورژنی کار می کنید؟
با sql2008

الان همین SP رو از کجا نوشتید؟
در قسمت server Explorer ویژوال استادیو کانشکن ساختم
در پوشه stored procedure ها راست کلیک Add...
فقط نفرمودید که در نهایت برای ایجاد جدول و ... بهتر است که کوئری بزنیم یا ویزارد یا تفاوتی ندارد؟
با تشکر