PDA

View Full Version : سوال: DataType های مناسب کدامند ؟ تاریخ ، TXT , عدد بزرگ



NasimBamdad
پنج شنبه 06 مرداد 1390, 15:12 عصر
سلام ،

چندی است که در فروم فعالیت می کنم و در مورد DataType ها سرچ کردم ، اما تاپیک مناسب و کاملی ندیدم .

برای یکسری پارامتر هایی نیاز دارم که بدانم چه DataType باید انتخاب کنم

1- برای تاریخ مثل 1390/05/20 که بعدا در DataGridView و Cristal Reporter و امثال این ها مورد بررسی و محاسبه قرار می گیرد

2- اعداد بزرگ مثل موبایل که 0 قبلشان دارند

3- اعداد بزرگ مثل شماره ملی که 10 رقمی هستند


مشکل بعدی که دارم این هست که من یک جدول دارم که اسامی پزشکانی در آن درج می شود ، بعد این اسامی در فرمی دیگر توسط یک COMBO_BOX لود می شوند و در COMBO_BOX اسامی ظاهر می شوند

در حال حاظر DataType این مورد را nchar(15) قرار دادم ،

مشکلی که دارم این هست که یک مقداری کاراکتر SPACE جلوی اسم پزشکان موجود هست ،

به این معنی که کاراکتر های اسم پزشک هر چه قدر باشد - منهای 15 کاراکتر محدود شده ، = تعداد کاراکتر های SPACE

اگر عکس رو مشاهده کنید ، بهتر متوجه می شوید

http://036.01.img98.net/out.php/i505604_1.GIF

اسم پزشکان متغیر هست و من نمی خواهم محدودیت کاراکتری قرار بدم ، فقط می خواهم اسامی بدون SPACE در دیتابیس ذخیره شوند

توجه کنید که این پارامتر های بالا ، بعدا مورد محاسبه و کوری و بررسی قرار می گیرند ،

در مورد تاریخ هم نیاز به تاریخ شمسی دارم ، چه دستور می فرمایید ؟

morteza271
پنج شنبه 06 مرداد 1390, 15:45 عصر
برای همه ی اینهایی که گفتین به نظر من بهترین نوع داده nvarchar هستش و همه کار میشه باهاش بکنی.
برای تاریخ نمیتونی date در نظر بگیری چون تاریخ شمسی رو نمیشه توش ذخیره کرد.

در مورد اسامی پزشکان هم به جای نوع داده nchar از nvarchar یا varchar استفاده کنید درست میشه.
نوع داده nchar به تعداد ثابت فظا در نظر میگیره و اگه اسمتون کوچکتر از 15 باشه بقیش رو اسپیس میذاره.
موفق باشید

NasimBamdad
دوشنبه 10 مرداد 1390, 12:17 عصر
برای همه ی اینهایی که گفتین به نظر من بهترین نوع داده nvarchar هستش و همه کار میشه باهاش بکنی.
برای تاریخ نمیتونی date در نظر بگیری چون تاریخ شمسی رو نمیشه توش ذخیره کرد.

در مورد اسامی پزشکان هم به جای نوع داده nchar از nvarchar یا varchar استفاده کنید درست میشه.
نوع داده nchar به تعداد ثابت فظا در نظر میگیره و اگه اسمتون کوچکتر از 15 باشه بقیش رو اسپیس میذاره.
موفق باشید

مرسی دوست عزیز ، همه چیز درست شد ، اما یک سوال ، الان که برای تاریخ شمسی من مقدار nvarchar رو انتخاب کردم ، چه طوری تاریخ ها رو با هم دیگه مقایسه کنم ؟

مثلا از تاریخ 01/01/1390 تا 10/01/1390 تعدادی بیمار پذیرش شدند و تاریخ پذیرش آن ها درج شده اند ،

حال چه طوری بگیم که اون هایی که بین 03/01/1390 تا 08/01/1390 پذیرش شوند رو نشان بده در یک DataGridView ؟ یعنی الان تاریخ رو به صورت STRING دریافت کرده ؟ چه طوری باید 2 تا تاریخ رو با هم دیگه مقایسه کرد ،

در مورد کوری که براش نوشت فکر کنم در WHERE باید از BETWEEN استفاده کرد ، مشکی نیست کوری رو پیدا می کنم ، اما می خواهم بدانم چه طوری باید 2 تاریخ رو با هم دیگه در C# مقایسه کرد

morteza271
دوشنبه 10 مرداد 1390, 12:29 عصر
سلام دوست عزیز.

اول از همه یادتون باشه برای اینکه مقایسه تاریخ ها همیشه درست جواب بده تمامی تاریخ ها رو به یه فرمت توی دیتابیس ذخیره کنید.
یعنی همه به صورت yyyy/mm/dd باشند مثلا تاریخ 1390/1/1 باید به صورت 1390/01/01 ذخیره بشه تا در هنگام مقایسه درست جواب بده.

برای مقایسه کردن هم میتونید از دو نوع کوئری استفاده کنید:
یکی همون BETWEEN که خودتون گفتین و هم با استفاده از کوئری زیر :
where Date>='1390/01/01' and Data<='1390/05/10'

موفق باشید

صادق صدقی
چهارشنبه 12 مرداد 1390, 00:42 صبح
ببخشید اما فکر کنم شما داری رشته رو مقایسه می کنی ها!!!!

فکر نکنم تاریخ های بینش رو بده!!!
اینو تو ام اس دی ان دیدم

"
بررسی اجمالی از SQL سرور 2008 انواع داده ها تاریخ


نسخه های قبلی SQL Server ارائه دو نوع داده تاریخ datetime یک smalldatetime smalldatetime . این نوع داده ها کافی برای اکثر برنامه های کاربردی است ، اما می تواند در موارد خاص دست و پا گیر است. به عنوان مثال ، هر دو نوع داده ها بخش تاریخ و زمان ، که فوق العاده است اگر این چیزی است که شما می خواهید ، اما cumberson اگر همه شما نیاز به ذخیره این است فقط تاریخ و یا فقط آن زمان است. به طور مشابه ، از تاریخ محدوده توسط این دو نوع داده اعمال -- 1753/01/01 9999-12-31 برای datetime و از 1900/01/01 تا 2079/06/06 smalldatetime برای smalldatetime -- کافی برای درصد کمی از برنامه های کاربردی.
SQL سرور 2008 راه حل های این مشکلات را با نگه داشتن datetime و smalldatetime و معرفی چهار جدید داده های تاریخ انواع : time ، date ، datetime2 و datetimeoffset . همانطور که شما احتمالا می تواند با نام خود را حدس بزنید ، انواع time های date و تاریخ ردیابی فقط یک بار و فقط یک بخش تاریخ بود. datetime2 نوع داده مانند نوع داده datetime ، اما دارای یک پنجره بزرگتر خرما (از 0001-01-01 به 9999-12-31) ، و percision بیشتر بر روی بخش زمان است. نوع داده datetimeoffset همان محدوده و دقت به عنوان نوع داده datetime2 را قادر می سازد ، اما افست از محلی UTC تنظیم شده اند (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://aspnet.4guysfromrolla.com/articles/081507-1.aspx&usg=ALkJrhhmbBX0eKN2x3Or6pgZxtRdtupzIw) مشخص می شود ، که باعث می شود آن را راحت تر برای ضبط و نمایش زمان محلی مربوطه به منطقه زمانی به کاربر نهایی است.
جدول زیر خلاصه اطلاعات فرمت این شش نوع ، محدوده ، دقت و حجم ذخیره سازی در کلمه در ادامه متن است (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/ms186724.aspx&usg=ALkJrhhpe1CQyoB7YhqEy3XJnLNCCOLtKg) ، و از تاریخ گرفته شده و انواع داده (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/ms186724.aspx&usg=ALkJrhhpe1CQyoB7YhqEy3XJnLNCCOLtKg) های زمان و توابع مدارک فنی شده است.
نوع داده ها قالب محدوده دقت ذخیره سازی اندازه (به بایت) time hh : میلی متر : [nnnnnnn] اس اس 00:00:00.0000000 از طریق 23:59:59.9999999 100 نانو ثانیه 3 تا 5 date YYYY - MM - DD 0001-01-01 از طریق 9999-12-31 1 روز 3 smalldatetime YYYY - MM - DD HH : MM : اس اس 1900/01/01 از طریق 2079/06/06 1 دقیقه 4 datetime YYYY - MM - DD hh : میلی متر : [NNN] اس اس 1753/01/01 از طریق 9999-12-31 0.00333 دوم 8 datetime2 YYYY - MM - DD HH : MM : اس اس [nnnnnnn 0001-01-01 00:00:00.0000000 از طریق 9999-12-31 23:59:59.9999999 100 نانو ثانیه 6 تا 8 datetimeoffset YYYY - MM - DD hh : میلی متر : اس اس [+|-]HH [nnnnnnn] : میلی متر 0001-01-01 00:00:00.0000000 از طریق 9999-12-31 23:59:59.9999999 ( در محلی UTC تنظیم شده (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://aspnet.4guysfromrolla.com/articles/081507-1.aspx&usg=ALkJrhhmbBX0eKN2x3Or6pgZxtRdtupzIw) اند ) 100 نانو ثانیه 8 تا 10
توجه : فضاهای ذخیره سازی انواع داده time datetime2 datetime2 ، datetimeoffset datetimeoffset بین یک محدوده زیرا هنگامی که شما با استفاده از نوع داده شما می توانید با دقت مشخص است.
بقیه این مقاله به date time زمان انواع داده را در جزئیات بیشتری در دست اقدام دارد ، و نشان می دهد که چگونه به این ارزش نوع داده ها در زمانی که آنها را در کنترل وب داده ASP.NET ( مانند GridView به) نمایش فرمت. کد و پایگاه داده در بقیه این مقاله مورد مطالعه قرار گرفت برای دانلود در دسترس است در پایان این مقاله است. برای کسب اطلاعات بیشتر در مورد دیگر انواع جدید داده های تاریخ ( datetime2 و datetimeoffset ) ، علاوه بر بخش شعرخوانی در پایان این مقاله مشورت.
ایجاد یک جدول با date time و زمان انواع داده


را به نمایش می گذارد با date time و زمان انواع داده SQL سرور 2008 پایگاه داده با یک جدول Employees نام کارمندان. این جدول دارای شمای زیر :
ستون نوع داده نظرات EmployeeID int کلید اولیه ، IDENTITY ستون FirstName nvarchar(50)
LastName nvarchar(50)
HireDate date تاریخ کارمند استخدام شد. StartTime time زمان روز کارمند کار خود را شروع می شود. EndTime time زمان روز کارمند کار خود را به پایان می رسد. LastLoginDate datetime تاریخ و زمان کارمند آخرین را بر روی اینترانت شرکت وارد شده است.
چهار پرونده در Employees جدول وجود دارد .
file:///G:/ASP.Net/Tutorial/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA/%D8%AA%D8%AD%D9%82%DB%8C%D9%82%20%D8%B2%D9%85%D8%A 7%D9%86/Microsoft/Fa_files/dateDataTypes1.gif نمایش کارکنان در یک صفحه وب ASP.NET


پس از ایجاد این جدول ، من یک صفحه وب ASP.NET با کنترل SqlDataSource را که تمام ستون ها و سوابق Employees از بازگشت به کارمندان ایجاد جدول. سپس قلاب شده تا این کنترل SqlDataSource را به یک GridView. (برای کسب اطلاعات بیشتر در مورد نمایش داده ها در یک صفحه وب ASP.NET ، نگاه کنید به من دسترسی و به (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://aspnet.4guysfromrolla.com/articles/011106-1.aspx&usg=ALkJrhjwNmTs3HGsqXpjXmWFlwr9FgcIRA) روز رسانی داده ها در ASP.NET سری مقالات است.)
بدون تعیین هر گونه ضوابط قالب بندی برای اطلاعات بازگردانده شده توسط کنترل SqlDataSource را ، GridView به خروجی زیر را نمایش می باشد.
file:///G:/ASP.Net/Tutorial/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA/%D8%AA%D8%AD%D9%82%DB%8C%D9%82%20%D8%B2%D9%85%D8%A 7%D9%86/Microsoft/Fa_files/dateDataTypes2.gif
توجه داشته باشید که HireDate ستون (از نوع date ) نمایش تاریخ به همراه زمان از نیمه شب (به عنوان مثال ، 2004/9/12 12:00 AM). این است زیرا وقتی HireDate مقدار ستون از پایگاه داده آن را به DateTime رنگی (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/system.datetime.aspx&usg=ALkJrhha1HZJwHYMtDfdH6VIx0OhhDjNAw) یک شی در زمان اجرا دات نت ، که دارای یک تاریخ و بخشی هم است. دلیل آن این است چرا که هیچ نوع "تاریخ" در دات نت است که فروشگاه ها فقط یک تاریخ وجود دارد. که توجه StartTime باشید EndTime و EndTime ارزش به عنوان یک ساعت 24 ساعته نظامی نمایش. این ارزش ها در واقع در زمان اجرا دات نت به عنوان نماینده TimeSpan اشیاء (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/system.timespan.aspx&usg=ALkJrhh12X2PjpsEpoZBNjxuxNywxopLqg) .
ما می توانیم صفحه نمایش از فرمت HireDate ستون به بخش هم با تنظیم BoundField را شامل نمی شود DataFormatString اموال (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.boundfield.dataformatstr ing.aspx&usg=ALkJrhiRzUsGzWG8Ly-qwEATTTejvIpIqw) به {0:d} . فرمت تصریح "D" فرمت تاریخ و ارزش زمان را به یک مقدار تاریخ کوتاه ، "است که فقط از تاریخ ، بدون زمان است. (برای یک لیست از رشته ها با فرمت DateTime اشیاء را ببینید (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/az4se3k1.aspx&usg=ALkJrhinZB7lSF6huLvdPmoTz9VpJR8tQA) رشته راهنمای حسگر ناحیه رنگی یک فرمت (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/az4se3k1.aspx&usg=ALkJrhinZB7lSF6huLvdPmoTz9VpJR8tQA) استاندارد و DateTime یک (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx&usg=ALkJrhiIKKSqNcTtF4A0d7zsYyYUpjK3eg) رشته راهنمای (http://translate.googleusercontent.com/translate_c?hl=en&ie=UTF8&prev=_t&rurl=translate.google.com&sl=auto&tl=fa&twu=1&u=http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx&usg=ALkJrhiIKKSqNcTtF4A0d7zsYyYUpjK3eg) فرمت .
متاسفانه ، ما می توانیم فرمت StartTime و EndTime ستون در به همان شیوه به TimeSpan TimeSpan شیء می تواند از طریق BoundField DataFormatString شود فرمت DataFormatString اموال. در عوض ما باید روش خود ما را در کد قالب بندی و ایجاد و سپس تبدیل BoundField به یک TemplateField و تماس با این روش ، عبور در StartTime برگردانده EndTime از StartTime و EndTime ستون.
شروع شده توسط ایجاد یک روش قالب بندی در کد پشت صفحه شما در ASP.NET در کلاس (و یا هنوز بهتر ، در یک کلاس جداگانه App_Code ی App_Code و یا در یک کتابخانه کلاس ). این روش باید در Object ( TimeSpan ارزش که از پایگاه داده) و بازگشت یک رشته (خروجی در صفحه نمایش داده شده است). در اینجا به روش قالب بندی مورد استفاده در نسخه ی نمایشی :
Protected Function DisplayAs12HourTime(ByVal timeValue As Object) As String
If Convert.IsDBNull(timeValue) Then
'Value to return when data is a NULL database value
Return "N/A"
Else
Dim ts As TimeSpan = CType(timeValue, TimeSpan)

If ts.Hours >= 12 Then
Return String.Format("{0:#0}:{1:00} PM", ts.Hours - 12, ts.Minutes)
Else
Return String.Format("{0:#0}:{1:00} AM", ts.Hours, ts.Minutes)
End If
End If
End Function
این روش طول می کشد Object یک جسم شروع می شود و با دیدن در Object که جسم مقدار یک NULL داده NULL ارزش است. اگر در آن است ، رشته "N / A" در سلول نمایش داده است. با این حال ، اگر آن را NULL ارزش نیست و پس از آن Object را به یک کاربر به سایر TimeSpan TimeSpan مثال و ساعت آن و اطلاعات دقیقه در یک فرمت 12 - ساعته نمایش داده است.
این روش نیاز از GridView به در نامیده می شود .aspx صفحه. به انجام رساندن آن ، تبدیل StartTime و EndTime BoundFields به TemplateFields و سپس پیکربندی خود را ItemTemplate ها DisplayAs12HourTime روش تماس بگیرید . پس از انجام این کار ، نشانه گذاری اعلانی TemplateFields باید نگاه شبیه به زیر است :
<asp:TemplateField HeaderText="Start Time" SortExpression="StartTime">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# DisplayAs12HourTime(Eval("StartTime")) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="End Time" SortExpression="EndTime">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# DisplayAs12HourTime(Eval("EndTime")) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
در نشانه گذاری فوق Text اموال وب برچسب کنترل تخصیص داده شده است ، مقدار برگردانده شده DisplayAs12HourTime DisplayAs12HourTime ، که در ارزش StartTime StartTime و EndTime EndTime است.
با تغییرات فوق به اموال DataFormatString HireDate BoundField و قالب بندی اعمال شده به StartTime و EndTime TemplateFields ، خروجی به دست آمده در حال حاضر HireDate از تاریخ برای HireDate و یک StartTime 12 EndTime برای StartTime و EndTime ارزش را نشان می دهد.
file:///G:/ASP.Net/Tutorial/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA/%D8%AA%D8%AD%D9%82%DB%8C%D9%82%20%D8%B2%D9%85%D8%A 7%D9%86/Microsoft/Fa_files/dateDataTypes3.gif مقایسه date و time ستون ها با datetime ستون


ممکن است زمان هایی وجود دارد زمانی که شما نیاز به مقایسه مقادیر موجود در date تاریخ time زمان ستون با کسانی که در datetime یک ستون . به عنوان مثال ، شما ممکن است بخواهید لیست همه کارمندان که آخرین زمان ورود به سیستم اتفاق افتاده در طول "ساعت خاموش" (است که ، اگر آنها در زمان خارج از خود StartTime شده EndTime و EndTime پنجره ). چالش در اینجا این است که StartTime و EndTime حاوی داده ها تنها وقت ، هیچ تاریخ وجود دارد. با این حال ، LastLoginDate ستون datetime است ، که هر دو یک تاریخ و زمان است . چگونه به یک را با هم مقایسه time ستون در مقابل تنها بخش هم datetime یک ؟ به همین ترتیب ، چگونه ما به مقایسه date ستون در مقابل تنها بخش تاریخ از datetime یک ستون ؟
برای انجام این مقایسه ما می توانیم تبدیل datetime مقدار را به date time زمان ارزش ، به عنوان مورد نیاز ، و مقایسه ما را از وجود دارد. به عنوان مثال ، برای نمایش یک لیست از کارکنان که به سیستم وارد شده در گذشته در طول "ساعت خاموش" ما می توانیم زیر استفاده کنید SELECT پرس و جو :
SELECT ...
FROM [Employees]
WHERE ([EndTime] < CAST([LastLoginDate] AS time) OR
[StartTime] > CAST([LastLoginDate] AS time))
که همه به آن وجود دارد! در اینجا من با استفاده از CAST( columnName AS dataType ) تابع تبدیل برای انجام. شما نیز می توانند استفاده CONVERT( dataType , columnName ) ) .
تصویر زیر نشان می دهد که نتایج حاصل از پرس و جو بالا را در یک GridView است.
file:///G:/ASP.Net/Tutorial/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA/%D8%AA%D8%AD%D9%82%DB%8C%D9%82%20%D8%B2%D9%85%D8%A 7%D9%86/Microsoft/Fa_files/dateDataTypes4.gif نتیجه


مایکروسافت معرفی چهار جدید داده های تاریخ انواع در SQL Server 2008 : time ، date ، datetime2 و datetimeoffset . date و time انواع داده برای ذخیره سازی تنها اطلاعات مورد نیاز اجازه می دهد ، در حالی که datetime2 datetime2 داده ها فراهم می کند محدوده بزرگتر از ارزش تاریخ امکان پذیر است و دقت datetime حسگر ناحیه رنگی یک موجود است. و datetimeoffset اجازه می دهد تا برای خرما به همراه با افست ذخیره می شود. مطمئن باشید برای دانلود دمو موجود در پایان این مقاله. شامل ساده SQL سرور 2008 پایگاه داده با یک جدول با ستون از date ، time ، datetime یک ، و نشان می دهد که چگونه این ارزش ها در یک صفحه وب به فرمت و چگونه به مقایسه date time زمان datetime رنگی یک ارزش است.

NasimBamdad
چهارشنبه 12 مرداد 1390, 15:05 عصر
من SQL SERVER 2005 استفاده می کنم ، نظر شما چی هست که من مقدار DATETIME یا SMALDATETIME رو قرار بردم ، البته برای تاریخ شمسی می خواهم یعنی این طوری


1390/01/01

اساتید چه نظری دارند ؟!

nilmil_nil
چهارشنبه 12 مرداد 1390, 15:28 عصر
با سلام
دوست عزیز
من تو تمام برنامه هام از نوع دادع char (10) استفاده می کنم و تا حالا به مشکلی بر نخوردم
و در مورد سوالت که چرا SPACE میوفته تو COMBoBOX به خاطر اینه که شما باید وقتی داده هاتونو از datatable میخونی بعد از .ToString() از .Trim() استفاده کنی تا تمام فاصله های بعد از
نام پزشک یا حالا هر چیز دیگه پاک شه

morteza271
چهارشنبه 12 مرداد 1390, 15:39 عصر
سلام.

نظر شما چی هست که من مقدار DATETIME یا SMALDATETIME رو قرار بردم
دوست عزیز چون شما میخواین تاریخ شمسی رو ذخیره کنید نمیتونید نوع داده رو DATETIME قرار بدین!


من تو تمام برنامه هام از نوع دادع char (10) استفاده می کنم
استفاده از نوع داده char مشکلی نداره و میشه مشکلشو با روش های مثل روش دوستمون حل کرد ولی یه مشکلی که داره هدر رفتن فضا هست چون این نوع داده باعث میشه که sql برای اون ستون به اندازه مثلا 10 تا فضا در نظر میگیره و اگه مثلا داده ی شما 5 تاشو پر کنه بقیش هدر میشه!!
بهترین روش استفاده از نوع داده varchar و یا nvarchar اینطوری دیگه نه هدر رفتن حافظه داریم و نه مشکلی که با استفاده از روشهایی مثل Trim حلش کنیم.

موفق باشید

golhay2
پنج شنبه 13 مرداد 1390, 00:31 صبح
کی می گه نمی شه، تاریخ را در بانک به صورت میلادی ذخیره می کنیم سپس با تبدیل به شمسی اونا نمایش می دیم اگه خواستی مثال می فرستم

aserfg
پنج شنبه 13 مرداد 1390, 10:53 صبح
بهتربن روش اینه که شما یک فیلد از نوع date که به میلادی هست داشته باشین و یک فیلد از نوع رشته . مقایسه رو از طریق میلادی و نمایش رو فیلد شمسی قرار بدین .

morteza271
پنج شنبه 13 مرداد 1390, 13:16 عصر
کی می گه نمی شه، تاریخ را در بانک به صورت میلادی ذخیره می کنیم سپس با تبدیل به شمسی اونا نمایش می دیم اگه خواستی مثال می فرستم
دوست عزیز منظور من از اینکه نمیشه این بود که نمیشه شمسی رو توی فیلد ذخیره کرد وگرنه میدونم میشه به صورت میلادی ذخیره کرد و برای نمایش تبدیل به شمسی کرد.
ولی به نظرتون این کار (ذخیره به صورت میلادی و نمایش به صورت شمسی) بهینه است؟؟؟
به نظر من نیست! دلیل :
یکبار در فرم ذخیره که کاربر به صورت شمسی وارد میکند باید آنرا به میلادی تبدیل کنیم و ذخیره کنیم.
یکبار در زمان نمایش باید تاریخ میلادی رو به شمسی تبدیل کنیم.
و در زمان های دیگر مثلا در هنگام جستجو که کاربر تاریخ رو به صورت شمسی وارد میکند باید به میلادی تبدیل کنیم و جستجو رو انجام بدیم.
و کلی موارد دیگر (یعنی هر بار که فیلد تاریخ مورد بحث باشه باید عمل تبدیل انجام بشه)
که در برنامه باید کلی تبدیل تاریخ انجام بدیم.

ولی اگه به صورت شمسی ذخیره کنیم :
هیچ تبدیل تاریخی نخواهیم داشت!!!
مگر در مواردخاص که مطمئنا خیلی کم اتفاق می افته.

حالا به نظرتون کدوم بهتره ؟؟؟

salehbagheri
پنج شنبه 13 مرداد 1390, 13:45 عصر
دوست عزیز منظور من از اینکه نمیشه این بود که نمیشه شمسی رو توی فیلد ذخیره کرد وگرنه میدونم میشه به صورت میلادی ذخیره کرد و برای نمایش تبدیل به شمسی کرد.
ولی به نظرتون این کار (ذخیره به صورت میلادی و نمایش به صورت شمسی) بهینه است؟؟؟
به نظر من نیست! دلیل :
یکبار در فرم ذخیره که کاربر به صورت شمسی وارد میکند باید آنرا به میلادی تبدیل کنیم و ذخیره کنیم.
یکبار در زمان نمایش باید تاریخ میلادی رو به شمسی تبدیل کنیم.
و در زمان های دیگر مثلا در هنگام جستجو که کاربر تاریخ رو به صورت شمسی وارد میکند باید به میلادی تبدیل کنیم و جستجو رو انجام بدیم.
و کلی موارد دیگر (یعنی هر بار که فیلد تاریخ مورد بحث باشه باید عمل تبدیل انجام بشه)
که در برنامه باید کلی تبدیل تاریخ انجام بدیم.

ولی اگه به صورت شمسی ذخیره کنیم :
هیچ تبدیل تاریخی نخواهیم داشت!!!
مگر در مواردخاص که مطمئنا خیلی کم اتفاق می افته.

حالا به نظرتون کدوم بهتره ؟؟؟


فرض کنید شما 5000 کاربر ثبت نام شده در Database دارید و میخواهید فقط افرادی که سن آنها بالای 20 سال هست رو انتخاب کنید! یا فرضاً افرادی که از آخرین مرخصی شون 20 روز میگذره، (یا کلاً هر عملیاتی که با تاریخ سروکار داره) توسط برنامه انتخاب بشن!

چطور این کار رو انجام می دهید؟ درسته انجام میشه ولی باید کل 5000 تا کاربر رو بخونید، تبدیل تاریخ انجام بدید یا اینکه با روشهای خاص خودتون سن اونها رو کشف کنید!

اما اگه به صورت datetime ذخیره بشن، فقط با اجرای یک دستور ساده، نتیجه مورد نظر در دستان شماست!

پس هیچگاه سعی نکنید با استانداردها مقابله کنید! گرچه ممکنه کمی رعایت اونها سخت باشه!

morteza271
پنج شنبه 13 مرداد 1390, 14:17 عصر
خیلی راحت میشه این کارها رو انجام داد.
مثلا :

فقط افرادی که سن آنها بالای 20 سال هست
تاریخ امروز رو منهای 20 سال میکنیم و کوئری رو اجرا میکنیم.
همه ی اینها قابل اجرا هست هرچند ممکنه کمی سختر بشه ولی عملیاتی که برای حالت دیگه انجام بدیم مطئمنا بیشتره.


فرض کنید شما 5000 کاربر ثبت نام شده در Database دارید
حالا فکر کنید لیست کاربران ثبت نام شده رو میخواین توی یه گرید نمایش بدین،باید چیکار کرد؟
غیر از اینه که برای هر سطر باید تاریخ میلادی رو به شمسی تبدیل کرد؟؟؟!!! اونم مثل همینه فرقی نمیکنه!!!

در ضمن من قصد مقابله با استانداردها رو ندارم فقط دلیل اینکه من از تاریخ شمسی استفاده میکنم رو گفتم و به نظرم بهتره.
و این استاندارد ها برای تاریخ میلادی صادقه نه برای تاریخ شمسی...

salehbagheri
پنج شنبه 13 مرداد 1390, 14:44 عصر
تاریخ امروز رو منهای 20 سال میکنیم و کوئری رو اجرا میکنیم.

میتونم کوئری شما رو ببینم؟ شما در ستون تاریخ فقط سال رو ذخیره میکنید یا اینکه کل تاریخ رو؟ فرضاً یکی در 1/1/1370 به دنیا اومده و یکی در 13/5/1370 که معادل 20 سال پیش امروزه! اینها از نوع تاریخ ثبت نشده اند، پس تاریخ اول رو چگونه تشخیص میدهید؟


حالا فکر کنید لیست کاربران ثبت نام شده رو میخواین توی یه گرید نمایش بدین،باید چیکار کرد؟
غیر از اینه که برای هر سطر باید تاریخ میلادی رو به شمسی تبدیل کرد؟؟؟!!! اونم مثل همینه فرقی نمیکنه!!!


این فقط یک تبدیل بسیار ساده هست! بحث سر عملیات ها بر روی تاریخ بود! تازه چندبار پیش اومده که یک برنامه همه کاربران رو یکجا نمایش بده؟

به هرحال این موضوع باید براتون تجربه بشه تا اینکه اهمیتش رو درک کنید! باز هم یک مثال میزنم: فرض کنید برنامه شما هنگام تبدیل تاریخ به شمسی دچار اشکال شده بوده و حدود 5000 کاربر نیز در این حین ثبت نام کردند! سال تاریخ تولد همه اینها اشتباهاً 1390 درج شده! به نظر شما تصحیح این موضوع خیلی ساده تر از یک تبدیل تاریخه؟ این موضوع زمانی تبدیل به یک فاجعه میشه که تعداد کاربران بسیار بالا بره!

مثالهایی همچون اینها که شما رو مجبور میکنه تا از نوع datetime تبعیت کنید زیاده! باز هم میگم انتخاب اشتباه در این موارد ضررهای جبران ناپذیری میتونه به شما وارد کنه!

تصمیم با خودتون!

morteza271
پنج شنبه 13 مرداد 1390, 15:36 عصر
میگم حالا که این بحث را افتاد خیلی خوب میشه اگه یه تاپیک ایجاد کنیم که در مورد نوع داده ها بحث بشه، چون مطمئنا خیلی از دوستان این مشکلات رو دارن.

حالا بحث خودمون :

میتونم کوئری شما رو ببینم؟
فرض کنید تاریخ امروز : 1390/05/12 و بنابراین با کم کردن 20 سال از این تاریخ میشه 1370/05/12 حالا کوئری رو اجرا میکنیم!به نظرم باید درست باشه دیگه،نه؟؟؟؟


برنامه شما هنگام تبدیل تاریخ به شمسی دچار اشکال شده بوده
اولا این برمیگرده به کدی که می نویسیم و در ضمن اگه قرار بر این باشه که برنامه دجار مشکل بشه پس برای حالت میلادی هم اگه تبدیل تاریخ شمسی (که کاربر وارد کرده) به تاریخ میلادی دچار مشکل بشه، همین مشکل پیش میاد،درسته؟؟؟

ببینید من مخالف استفاده از تاریخ میلادی نیستم فقط منم دارم نظرمو میگم چون راستش 4 ساله من دارم برنامه نویسی میکنم و همیشه از همین روش استفاده کردم و تا الان مشکلی نداشتم!

از دوستان دیگه هم خواهش میکنم هرکی نظری داره بگه تا به یه نتیجه درست و حسابی برسیم.
با تشکر

salehbagheri
پنج شنبه 13 مرداد 1390, 16:51 عصر
البته این بحث ربطی به #C نداره ولی :


فرض کنید تاریخ امروز : 1390/05/12 و بنابراین با کم کردن 20 سال از این تاریخ میشه 1370/05/12 حالا کوئری رو اجرا میکنیم!به نظرم باید درست باشه دیگه،نه؟؟؟؟

من کوئری نمی بینم! و البته بماند که نمیدونستم اگه 20 تا از 90 کنی میشه 70 !(بگذریم)


پس برای حالت میلادی هم اگه تبدیل تاریخ شمسی (که کاربر وارد کرده) به تاریخ میلادی دچار مشکل بشه، همین مشکل پیش میاد،درسته؟؟؟

طبیعتاً خیر! این مشکل به وجود نمیاد!

شما فیلدی از نوع nvarchar دارید که تاریخ شمسی "5/13/1390" درآن ذخیره شده! اگه اشتباهاً این تاریخ میبایست 5/13/1370 ذخیره میشد، در تعداد بالا چه کار میکردید؟

اما اگه این تاریخ اشتباه ذخیره بشه ولی از نوع میلادی و datetime باشه کافیه با تابع AddYear داخل خود پایگاه داده، با اجرای یک کوئری ساده 20 سال کم کنید!

شما باز بگو به این روش میشه، به اون روش میشه! ولی من روش بهینه مد نظرم هست و هیچگاه نگفتم که این کار نشدنی هست!

همیشه به یاد داشته باشید که در همه کارها اشتباه وجود داره! هیچ کس نمی تونه ادعا بکنه که برنامه اش هیچ ایرادی نداره! پس همیشه سعی کنیم روشی رو انتخاب کنیم که بروز اشتباه رو کاهش میده و همچنین اگه اشتباهی رخ داد، حلش رو آسون کنه! نه اینکه روشی انتخاب کنیم که در حال حاضر سرعت بهتری داره و بهینه تره، ولی بعداً ممکنه بخاطر یک اشتباه نشه جمعش کرد!

من احساس میکنم که نمیتونیم همدیگه رو بفهمیم!

morteza271
پنج شنبه 13 مرداد 1390, 17:08 عصر
این کوئری :
select * from tbl where date>='1370/05/12'
تست کنید ببینید درست جواب میده یا نه!!!!


البته بماند که نمیدونستم اگه 20 تا از 90 کنی میشه 70
پس چند میشه؟؟؟؟؟؟؟؟؟!!!:گیج::گیج::گی ج:


من احساس میکنم که نمیتونیم همدیگه رو بفهمیم!
دوست عزیز من که گفتم دارم نظرمو میدم!!!
نظر دادن که مشکلی نداره، نظر من اینه نظر شما هم اونی که خودتون میگین!!فکر نمیکنم مشکلی داشته باشه اگه از نظرمون به طور منطقی حمایت کنیم(چون به نظر هر کدوممون نظر خودمون درسته مگه اینکه عکسش ثابت بشه)!!!!
بهتره دیگه ادامه ندیم...
موفق باشید.