PDA

View Full Version : مشکل بزرگ در دیتاتایپ نوع تاریخ - Date در vb.net



Nourizadeh_62
جمعه 26 آبان 1385, 18:50 عصر
سلام
راستش نمی دونم این سوال ابتداییه یا نه
اما برای من که یه مشکل بزرگ درست کرده
خب
ما دیتاتایپی از نوع date و datetime در وی بی دات نت داریم
خب طبیعتاً می توانیم متغیری از این نوع تعریف کنیم و مقادیر تاریخ را در داخل آن بریزیم.
اما باید توجه کنیم که این مقادیر حتماً تاریخ میلادی باشند.
چون مثلاً اگر تاریخ 1385/04/31 را در این متغیر بریزید با خطای invalid date مواجه خواهید شد.
چون ماه چهارم تاریخ میلادی روز 31 ندارد.!!؟؟
خب به نظر شما برای ریختن مقادیر تاریخ شمسی در این نوع دیتاتایپ چه کار باید کرد؟
لازم است که این متغیر از نوع تاریخ تعریف شود چون داخل دیتابیس نیز فیلد از این نوع تعریف شده و در گزارش گیری تعیین محدوده تاریخ نیاز است.
من از دات نت فریم وورک 2.0 استفاده می کنم.
اجازه بدین مثالی بزنم تا متوجه بشین که منظور من تابع تبدیل تاریخ شمسی نیست!!!!!



dim a as datetime
a = "1385/04/31"


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


واقعاً شما چی کار می کنید؟
تا حالا چجوری با این مشکل کنار اومدید؟
بی نصیبمون نگذارید...

linux
جمعه 26 آبان 1385, 20:49 عصر
چندتا پست قبلتر همین بحث بود

toofan010
جمعه 26 آبان 1385, 22:19 عصر
ریخ شمسی رو تو اینترنت جستجو و از اونا استغاده کنی

Nourizadeh_62
شنبه 27 آبان 1385, 01:21 صبح
اساتید گرامی:
منظور بنده تابع تبدیل تاریخ شمسی نیست!!!!!!!!!!!
لطفاً دقیقتر مطالعه بفرمایید
.......................
بنده این تاپیک را هم دیدم:
http://barnamenevis.org/forum/showthread.php?t=27313
اما خب مشکل با روش اون تاپیک حل نمی شود بلکه گرد می شود.
اینکه بعد از اینکه تاریخ رو از کاربر گرفتیم به میلادی تبدیل کنیم و اون رو ذخیره کنیم.
بعد مثلاً برای انتخاب محدوده تاریخ، محدوده تاریخ شمسی رو از کاربر بگیریم، تبدیل به میلادی بکنیم، و سپس در اون بازه جستجو کنیم و رکوردها را انتخاب بکنیم.
رکوردهای انتخاب شده را یکی یکی به تاریخ شمسی تبدیل کنیم و نمایش بدهیم؟؟؟!!!!!!
دو تا مشکل:
1. تو محیطی مثل crystalreport استفاده از تاریخ شمسی رو بلد نیستم
2. فرض کنید 25.000 تا رکورد نتیجه داشتیم. می دونید چقدر زمان تلف میشه و پدر دیتابیس درمیاد؟
3. خیلی راه افتضاحیه
4. یعنی واقعاً بیل گیتس فکر اینو نکرده؟ اون persiancalendar چیه گذاشته؟ بجای اون یک دیتا تایپ دینامیکی برای تاریخهای متفاوت طراحی بکنه
(گزینه آخر صرفاً یک پیشنهاد برای بیل گیتسه)

واقعاً کمک کنید. گیر افتادم....

rezaei manesh
شنبه 27 آبان 1385, 08:04 صبح
سلام
من برای حل این مشکل نوع تاریخ رو همیشه از نوع string می گیرم و چک می کنم که حتما با یک فرمت وارد بشه یا من اونو در صورت امکان به یک فرمت واحد تبدیل کنم مثلا 10 کاراکتری
بعد با دستورات ساده می شه انتخاب محدوده تویه هر محیطی انجام داد
اما برای ذخیره از نوع date من یک جا تو همین سایت دیدم که می گفتن مشکلی برای ذخیره نداره چون به این صورتی که وارد میشه ذخیره نمی شه تبدیل می شه و بعد در حافظه ذخیره می شه
اگه خیلی اسرار داری که از نوع date ذخیره کنی می تونی به میلادی تبدیل کنی و بعد یه SP بنویسی که دوباره اونارو تبدیل به شمسی کنه و تو گزارش گیری یا هر جایه دیگه از اون استفاده کنی

Nourizadeh_62
شنبه 27 آبان 1385, 14:55 عصر
ممنون
اما SP یعنی چی؟

rezaei manesh
شنبه 27 آبان 1385, 15:12 عصر
sp=Stored Procedures
در پروسیجر می توان کد نوشت و خروجی گرفت تو همین سایت اگه بگردی در موردش چندتا مثال خوب می تونی پیدا کنی

na3er-faraji
شنبه 27 آبان 1385, 15:14 عصر
ببین دوست عزیز . من هم دقیقا همین مشکل رو داشتم که متاسفانه دوستان همین جواب رو به من دادند و من هم همین کار رو کردم و فیلدها رو هم تو بانک برنامت بهتره استرینگ بگیری و اونا رو درج کنی و فقط واسه اینکه به مشکل برنخوری بهتره حتما اینجوری درج کنی

1385/07/09 درست
1385/7/9 غلط

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

na3er-faraji
شنبه 27 آبان 1385, 15:22 عصر
فکر کنم یعنی Stored Procedure

Maryam_y_m
یک شنبه 28 آبان 1385, 17:35 عصر
بهترین کار اینه که تاریخ را از همان ابتدا به صورت شمسی و با فرمت یکسان در یک ستون از نوع char ذخیره کنید. چون ذخیره کردن تاریخ به میلادی هیچ فایده ای برای شما ندارد و برای استفاده از آن مجبور میشوید دوباره آنرا به شمسی تبدیل کنید که وقت زیادی تلف میکند.

i_naderpour
دوشنبه 29 آبان 1385, 02:59 صبح
من هم تو یه برنامم همین کار رو کردم بهترین شیوس به نظر من
به من که جواب داده . مخصوصا توی crystal report کارت رو راحت می کنه در واقع برای فیلتر کردن
رکورد ها از فیلد date استفاده می کنی اما در ریپورتت فیلد text رو چاپ می کنی

اَرژنگ
دوشنبه 29 آبان 1385, 03:57 صبح
استفاده از string برایه نگهداری تاریخ کاره درستی نیست. به این دلایل
۱) حساب کردن با تایخ ممکن نیست
۲) مقدار مشکلاتی که استفاده ازtringگ به مشکلات و سخت کردن دیباگ اضافه میکنه
از فایدهایه زاهریش خیلی بیشتره.
۳)روش استفاده از سترینگ برایه حل مشکلات روشه مبتدا گرانه است و همان روشه استفاده
از یک تاریخ میلادی و تبدیل کردن از آن به تاریخ شمسی و بلعکس در دراز مدت بهتره.

rezaei manesh
دوشنبه 29 آبان 1385, 07:51 صبح
منظورت از حساب کردن چیه؟
چه مشکلاتی استفاده از استرینگ داره؟!
برای گزینه 3 هم که دلیل باید بیاری
از اساتید خواهش می کنن نظر بدن و یک روش اصولی پیشنهاد کنن که همه با اون روش کار کنیم
اما من به شخصه با استرینگ تا حالا مشکلی نداشتم

zarrin_306
دوشنبه 29 آبان 1385, 11:52 صبح
بهترین کار اینه که تاریخ را از همان ابتدا به صورت شمسی و با فرمت یکسان در یک ستون از نوع char ذخیره کنید. چون ذخیره کردن تاریخ به میلادی هیچ فایده ای برای شما ندارد و برای استفاده از آن مجبور میشوید دوباره آنرا به شمسی تبدیل کنید که وقت زیادی تلف میکند.

منم موافقم
خیلی راحت و ساده

بنظر من بهترین راه همینه اگر فقط هدف ثبت و درج تاریخ باشد

rezaei manesh
دوشنبه 29 آبان 1385, 13:17 عصر
بنظر من بهترین راه همینه اگر فقط هدف ثبت و درج تاریخ باشد
در این که شکی نیست اگه فقط ثبت باشه
مشکل زمانی پیش میاد که بخوای روی تاریخ محاسبه و یا جستجو انجام بدی!

اَرژنگ
دوشنبه 29 آبان 1385, 16:23 عصر
منظورت از حساب کردن چیه؟
چه مشکلاتی استفاده از استرینگ داره؟!
برای گزینه 3 هم که دلیل باید بیاری
از اساتید خواهش می کنن نظر بدن و یک روش اصولی پیشنهاد کنن که همه با اون روش کار کنیم
اما من به شخصه با استرینگ تا حالا مشکلی نداشتم با سلام،
http://pveentjer.wordpress.com/2006/10/11/string-is-not-a-good-universal-datatype/
http://www.javalobby.org/java/forums/t82715.html

rezaei manesh
دوشنبه 29 آبان 1385, 16:57 عصر
آقا پس یه نظر دیگه اگه تاریخ رو از نوع اینتیجر بگیریم چطوره؟مثلا 13620123
و موقع نمایش فقط / رو جایگزین کنیم اینطوری سرعت محاسبات هم بهتره و...

Maryam_y_m
دوشنبه 29 آبان 1385, 17:04 عصر
برایه مثال فرض کنید یکی تاریخ را اشتباه وارد کنه، برایه اینکه از استرینگ استفاده میشه هیچ اخطاری داده نمیشه و یک استرینگ بی معنی در داتابیس ذخیره میشه.

هنگام save که در همه برنامه ها معموله که قبلش حتما valid بودن اطلاعات چک شود(اعم از فرمت تاریخ)
حتی محاسبه اختلاف دو تاریخ و امثالهم هم در صورتی که تاریخ string باشد به راحتی امکان پذیر است.


استفاده از استرینگ قابلیت پیدا کردنه خطاها را از زمان کمپایل به زمان اجرا میبره

منظورتون رو متوجه نمیشم. مگه قراره توی ثبت یا بازیابی تاریخها خطایی پیش بیاد؟ اون هم یه string معمولیه!
من در برنامه هایی که سالهاست در حال اجراست و با همین روش کار میکند کوچکترین مشکلی ندیدم.
در ثانی الزامی نداره که حالا چون یک type تاریخ در Sql وجود دارد خودمان را به هر قیمتی شده ملزم به استفاده از آن کنیم. بهتره ببینیم کدوم روش بهینه است. بله اگر تاریخمون میلادی بود استفاده نکردن از آن کاملا مسخره بود.
آنهم وقتی موقع ورود اطلاعات کاربر تاریخ شمسی میدهد و موقع گزارش هم تاریخ شمسی میگیرد . فرض کنید برای یک گزارش سنگین با خروجی زیاد ، به ازای تک تک رکورها باید تابع تبدیل تاریخ اجرا شود . استفاده از این روش در برنامه های واقعی و اجرایی عملا غیر ممکن است.

rezaei manesh
دوشنبه 29 آبان 1385, 17:12 عصر
من با ذخیره تاریخ به صورت میلادی به شدت مخالفم
اما اگه حجم رکودها خیلی زیاد باشه آیا بهتر نیست که ما برای اینکه رکرودها رو سریعتر پیدا کنه دادها از نوع اینتیجر باشند؟
بازهم می گم من با استرینگ تا حالا مشکلی نداشتم البته حجم رکوردهام هم تا حالا زیر 10 هزار تا بوده

zarrin_306
دوشنبه 29 آبان 1385, 22:50 عصر
من خودم برای راحتی خودم در یک برنامه
این کار رو کردم
یک فیلد رو به تاریخ بهصورت کامل قرار دادم
و یک فیلد دیگر رو برای جستجو قرار دادم

21/مهر/1385
1385 7 21

اَرژنگ
سه شنبه 30 آبان 1385, 08:53 صبح
یکی از اولین اصول برنامه نویسی استفاده از داتا‌تایپها میباشد.
اگرچه میشه همه چی را تبدیل به استرینگ کرد، ولی این خلاف اصوله برنامه نویسی است.
اینکه چرا از استرینگ استفاده کردن در هر جایی درست نیست بحثیه که متعلق به اصول برنامه نوسیست و نه فقط وی بی.
اگرچه استفاده کردن از استرینگ ممکنه در کوتاه مدت راحت باشه ولی در دراز مدت اشکلا ایجاد میکنه، اگرچه در پروژههایه یک نفره که یک نفر تمامه خصوصیاته پروژه را میدونه و احتیاج به توسعه زیاد نداره ممکنه خوب پیش بره، کاری که در دراز مدت در پروژه هایه بزرگ ایجاد میکنه قابل قبول نیست.
اگر استفاده از استرینگ کاره درستی، چرا داتا تایپه تاریخ وجود داره؟
کسی که سوال اول را پرسید در راهه درست داشت حرکت میکرد، چونکه میدونست باید از یک داتتایپ درست استفاده کنه،
http://www.microsoft.com/globaldev/DrIntl/columns/002/default.mspx#EADhttp://www.microsoft.com/globaldev/DrIntl/columns/002/default.mspx#EAD

اَرژنگ
سه شنبه 30 آبان 1385, 08:59 صبح
من با ذخیره تاریخ به صورت میلادی به شدت مخالفم
اما اگه حجم رکودها خیلی زیاد باشه آیا بهتر نیست که ما برای اینکه رکرودها رو سریعتر پیدا کنه دادها از نوع اینتیجر باشند؟
بازهم می گم من با استرینگ تا حالا مشکلی نداشتم البته حجم رکوردهام هم تا حالا زیر 10 هزار تا بوده

۱) دلیله اینکه از استفاده از تاریخ میلادی مخالف هستید چیه؟
۲) میشه از تاریخه هجری استفاده کرد:
http://www.microsoft.com/globaldev/DrIntl/columns/002/default.mspx#EAD

اشکال استفاده از این روش نقضه اصوله برنامه نویسیست ، اسماً استفاده از داتا تایپهایه درست برایه کاری که انجام میشه، اینکه یک روش راحته دلیل بر درست بودنش نیست، چونکه استفاده از متغییرهایه سراسری هم آٔسونه ولی کاملاً علیه اصوله برنامه نویسیه.

rezaei manesh
سه شنبه 30 آبان 1385, 09:23 صبح
ذخیره تاریخ به صورت میلادی کار سختی نیست
اما مشکل من این که نمی تونم قبول کنم که هزاران رکورد من موقع نمایش بیان و تبدیل بشن یعنی هزاران بار یک تابع تبدیل تاریخ رو اجرا بکنه در صورتی که میشه این چک کردن ولید بودن تاریخ رو هتگام ورود انجام داد که سرعت در اونجا برای یکی اصلا محسوس نیست
اگه حتی 40 درصد خروجی های ما هم به صورت میلادی بود با می شد قبول کرد اما ..
متغییر datetime برای تاریخ شمسی نیست پس نمی تونیم بگیم که یک متغیر برای شمسی داریم اما ما رفتیم سراغ یکی دیگه ؟ ! پس همچینم نقض حقوق بشر نیست!
باز هم من در حد سواد خودم می گم دوست دارم اساتید محترم سایت هم نظر خودشونو بگم
در ضمن فکر می کنم این مبحث دیگه داره زیادی طولانی می شه و جاش اینجا نیست
با تشکر

اَرژنگ
سه شنبه 30 آبان 1385, 09:30 صبح
هنگام save که در همه برنامه ها معموله که قبلش حتما valid بودن اطلاعات چک شود(اعم از فرمت تاریخ)
حتی محاسبه اختلاف دو تاریخ و امثالهم هم در صورتی که تاریخ string باشد به راحتی امکان پذیر است.

اشتباهی روش به آسان و یا سخت بودنش نیست، استفاده از داتا تایپ درست یکی از اصوله اصلی برنامه نویسیت. اگر همین بحث را انجمن دلفی داشتیم قیامت میشد! استفاده از استرینگ به جایه تایپ درست برایه هیچ برنامه نویسی قابل قبول نیس.
در ضمن محاسبات با تایپه تاریخ از استفاده از استرینگ بهتر است، و یا یکی تاریخ شمسی را تعریف میکنه و از آن استفاده میکنه ( اگر دات نت ۲ استفاده میکنند تبدیل از یک تاریخ به تاریخ دیگر جزوه دات نت است).



منظورتون رو متوجه نمیشم. مگه قراره توی ثبت یا بازیابی تاریخها خطایی پیش بیاد؟ اون هم یه string معمولیه!
من در برنامه هایی که سالهاست در حال اجراست و با همین روش کار میکند کوچکترین مشکلی ندیدم.
در ثانی الزامی نداره که حالا چون یک type تاریخ در Sql وجود دارد خودمان را به هر قیمتی شده ملزم به استفاده از آن کنیم. بهتره ببینیم کدوم روش بهینه است. بله اگر تاریخمون میلادی بود استفاده نکردن از آن کاملا مسخره بود.

۱) استفاده از روشه اشتباه به عنوانه بهینه کردن درست نیست.
۲) کسی مجبور نیست که از تایپه بخصوصی استفاده کنه، چرا بولیین ، اعداد و همه چر را به استرینگ تبدیل نمیکنند؟
چونکه استفاده از تایپ درست جزوه اصوله برنامه نویسیت.
پس چرا تاریخه هجری استفاده نمیکنید، اس کیو ال سرور تایخه هجری داره، اگر چه استفاده از تاریخ میلادی هیچ فرقی با استفاده از تایخه شمسی نداره، تنها موقعی که احتیاج به نشان دادن و یا گرفتن از کاربر هست از میلادی به شمسی تبدیل میکنند و بالعکس، در دات نت ۲ این ساپورت داره.
در ضمن استفاده از استرینگ به بهینگی ربط نداره ، بهش مگن هک که از نظر برنامه نویس با کلک یک کاری را تند تر انجام میده تا آنکه از روش درست که تمرکزه فکر میخواد و پایدارتر است استفاده کنه.



آنهم وقتی موقع ورود اطلاعات کاربر تاریخ شمسی میدهد و موقع گزارش هم تاریخ شمسی میگیرد . فرض کنید برای یک گزارش سنگین با خروجی زیاد ، به ازای تک تک رکورها باید تابع تبدیل تاریخ اجرا شود . استفاده از این روش در برنامه های واقعی و اجرایی عملا غیر ممکن است.
۱) روشی با یک کاربر کار میشه با روشه که یک گذارش درست میشه فرق داره. در گذارش از ۲ راه میشه استفاده کرد
آ(استفاده از اس کیو الی پروسیجر که در یک آن همه رکورداه را تبدیل میکنه
ب(پرسیدنه یک سوال در انجمنه اس کیو ال ، قابل قبول نیست که این روش روشی باشه که بانکها و uا شرکتهایه بزرگ ازش استفاده میکنند، حتماً یکی یک روش درست برایه اینکار داره.

اَرژنگ
سه شنبه 30 آبان 1385, 09:42 صبح
ذخیره تاریخ به صورت میلادی کار سختی نیست
اما مشکل من این که نمی تونم قبول کنم که هزاران رکورد من موقع نمایش بیان و تبدیل بشن یعنی هزاران بار یک تابع تبدیل تاریخ رو اجرا بکنه در صورتی که میشه این چک کردن ولید بودن تاریخ رو هتگام ورود انجام داد که سرعت در اونجا برای یکی اصلا محسوس نیست
اگه حتی 40 درصد خروجی های ما هم به صورت میلادی بود با می شد قبول کرد اما ..
متغییر datetime برای تاریخ شمسی نیست پس نمی تونیم بگیم که یک متغیر برای شمسی داریم اما ما رفتیم سراغ یکی دیگه ؟ ! پس همچینم نقض حقوق بشر نیست!
ر

http://lytopia.com/Articles/Article.aspx?id=6


//An Iranian Date : 19 Mehr 1359
DateTime PersianDate = new DateTime( 1359, 7, 19, new PersianCalendar() );

باز هم من در حد سواد خودم می گم دوست دارم اساتید محترم سایت هم نظر خودشونو بگم
در ضمن فکر می کنم این مبحث دیگه داره زیادی طولانی می شه و جاش اینجا نیست
با تشکر شما از تابعهایه جمعی ، مثلاً Sum, Avg etc.. در اس کیو ال سرور استفاده کردید؟
میشه ۱۰۰۰۰۰ رکورد را با هم جمع بزنه ، در ضمن یک گزارش هر ثانیه درست نمیشه که بار سنگین اجرا کنه، اگرچه اگر این تاریخ جایی دیگر در برنامه استفاده نمیشه و فقط در یک جا گرفته میشه و بعداً هم گزارش میشه، میشه استفاده از استرینگ را قبول کرد. به شرطه اینکه هیچ وقت کسی درخواست دیگری در مورد توسعه برنامه نکنه که با این تاریخ ربط داشته باشه .
به هر حال یکی از اساتید بیاد بگه که فایده هایه استفاده از تایپها که در اول هر کورسه برنامه نویسی یاد میدن چیه.
مخلصیم

اَرژنگ
سه شنبه 30 آبان 1385, 10:14 صبح
جوابهایه درست برایه اینکار،
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=20
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=24
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=26 (http://barnamenevis.org/forum/showpost.php?p=270173&postcount=24)

linux
پنج شنبه 02 آذر 1385, 10:43 صبح
جوابهایه درست برایه اینکار،
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=20
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=24
http://barnamenevis.org/forum/showpost.php?p=270173&postcount=26

جناب آقای آرژنگ همه چیز را توضیح دادند من قبلا تو همه این پست های مطلب را نوشتم .
ببینید چرا اصرار دارید که کارهای عجیب غریب بکنید.
تاریخ در sqlserver2000 بصورت یک دوتا 4 بایت ذخیره میشه که 4 بایت اول روزهای گذشته از مبدا تقویم را نشان می دهد و 4 بایت دوم میلی ثانیه های گذشته از نیمه شب
مبدا تاریخ هم 1900/01/01 هست.
پس فکر نکنید که تاریخ میلادی به صورت یک رشته ذخیره میشه در هر صورت شما وقتی یک مقدار تاریخ را به یک فیلد از نوع تاریخ می دهید خود sql این مقدار رشته ای را به معادل عددی آن تبدیل می کند.