PDA

View Full Version : پیدا کردن تاریخ های بین دو تاریخ شمسی



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

Select * From Table1 Where pDate Between #1385/02/31# and #1386/012/29#

اما همون طور که میدونید دستورات sql برای ماه های میلادیه و مثلا چون ماه دوم اونا 28 روزیه خطا می گیره . مطمینم خیلی ها به این مشکل برخوردند . پس Please Help Me

programmermp
سه شنبه 02 آبان 1385, 16:14 عصر
با سلام

دوست عزیز یک راه حل که به ذهن من میرسه اینه که یک تابع بنویسی که تاریخ رو از کاربر

شمسی دریافت بکنه در یک بازه مشخص مثلا از 25/8/85 تا 25/9/85 اونوقت تاریخ رو به

میلادی تبدیل کنه و در همون کدی که نوشتی بزاره برای دینامیک کردن کدت هم می تونی

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

به همین راحتی

linux
سه شنبه 02 آبان 1385, 18:04 عصر
سلام
ببخشید من احتیاج دارم داده های بین دو تاریخ شمسی رو بدست بیارم . از این دستور استفاده میکنم

Select * From Table1 Where pDate Between #1385/02/31# and #1386/012/29#

اما همون طور که میدونید دستورات sql برای ماه های میلادیه و مثلا چون ماه دوم اونا 28 روزیه خطا می گیره . مطمینم خیلی ها به این مشکل برخوردند . پس Please Help Me
دکتر! تو قسمت ویبی جوابت را دادم.
تاریخهاتو در دیتابیس چه مدلی ذخیره می کنی؟

na3er-faraji
سه شنبه 02 آبان 1385, 20:37 عصر
دکتر! تو قسمت ویبی جوابت را دادم.
تاریخهاتو در دیتابیس چه مدلی ذخیره می کنی؟

دوست عزیز این قضیه دیگه ربطی به زبان برنامه نویسی نداره . مشکل اینه که خود sQL چنین دستوری رو قبول نمیکنه و ارور میده .

linux
سه شنبه 02 آبان 1385, 23:51 عصر
دوست عزیز این قضیه دیگه ربطی به زبان برنامه نویسی نداره . مشکل اینه که خود sQL چنین دستوری رو قبول نمیکنه و ارور میده .

تاریخ را چه جوری ذخیره می کنی در دیتابیس؟
اگر بصورت تاریخ میلادی بخواهی ذخیره کنی که اصلا اشتباه هست که شما متغیر میلادی تعریف کنید و در آن تاریخ شمسی بخواهید قرار بدهید.
اگر بصورت رشته تعریف کنی می توانی از همان دستور بالا که نوشتی استفاده کنی
فیلد میلادی هم در حقیقت یک عدد از نوع double هست
چندتا پست پایین تر یکسری توابع هست که می توانی تاریخ میلادی و شمسی را در داخل sql به هم تبدیل کنی

na3er-faraji
چهارشنبه 03 آبان 1385, 11:10 صبح
به صورت رشته ذخیره میکنم . اما از دستورم اشکال میگیره
Select * From Table1 Where pDate Between #1385/02/31# and #1386/012/29#
این ربطی به بانک اطلاعاتی نداره و خود دستور sql غلطه

na3er-faraji
چهارشنبه 03 آبان 1385, 19:26 عصر
مطمئنا خیلی ها به این مشکل برخوردند . کسی چیزی به نظرش نمیرسه !!!

linux
چهارشنبه 03 آبان 1385, 22:41 عصر
به صورت رشته ذخیره میکنم . اما از دستورم اشکال میگیره

این ربطی به بانک اطلاعاتی نداره و خود دستور sql غلطه

اگر به صورت رشته ذخیره می کنی کدی که نوشتی کاملا غلط هست


Select * From Table1 Where pDate Between '1385/02/31' and '1386/012/29'

بجای # از ' باید استفاده کنی

اَرژنگ
سه شنبه 30 آبان 1385, 10:05 صبح
اینجا قراره مرجع تخصصی برایه برنامه نویسها باشه، استفاده از رشته برایه تاریخ روشه اشتباه و ابتداییه، یعنی هیچ کی روشه درسته این کار را نمیدونه؟ استفاده ازداتاتایپ درست برایه همه اینجا بی معنیه؟

vahab_vb
پنج شنبه 24 اسفند 1385, 23:24 عصر
اونوقت اگر از نوع تاریخ میلادی باشه، خب سیستم از کجا میفهمه که yy/mm/dd هست یا mm/dd/yy یا چیز دیگه ؟؟؟؟

hani bageri
پنج شنبه 21 تیر 1386, 14:16 عصر
منم به این مشکل برخوردم!اگه از طریق رشته این مشکل حل نشه پس حتما با کد نویسی حل میشه!هر کی میتونه لطفا کدشو بنویسه

Hamid.Kad
پنج شنبه 21 تیر 1386, 14:40 عصر
جناب linux که جواب دادند
Select * From Table1 Where pDate Between '1385/02/31' and '1386/012/29'

این دستور کاملاً درسته و جواب هم میده. البته به شرطی که فیلد pDate از نوع رشته باشه

whitehat
پنج شنبه 21 تیر 1386, 19:38 عصر
روشهایی بهتر از ذخیره سازی string برای تاریخ شمسی وجود داره
اگر نخواهم از DataType استفاده کنم من ترجیح می دهم تاریخ های شمسی را با نوع int ذخیره می کنم(با تعداد رقم ثابت) این روش چند مزیت نسبت روش رشته ای داره
- سایز ذخیره سازی کمتر(4 بایت)
- سریعتر شدن کوئری ها ،مخصوصا در Join بر اساس تاریخ
- امکان استفاده از عملگر ها مقایسه ای
راه حل دیگه استفاده از یک تابع Covert میلادی به شمسی و برعکس در clr هست که از سرعت خوبی برخوردار هست،اما سرعت آن از روش بالا کمتر است
از یک UF هم برای این کار می توان استفاده کرد که سرعت آن نیز به مراتب از دو روش قبل کمتر است

MajerajooyeKhallagh
شنبه 23 تیر 1386, 07:55 صبح
اونوقت اگر از نوع تاریخ میلادی باشه، خب سیستم از کجا میفهمه که yy/mm/dd هست یا mm/dd/yy یا چیز دیگه ؟؟؟؟

دوست عزیز
وقتی تاریخ را از نوع Varchar میگیرید برای Sql قابل تشخیص نیست که این عبارت تاریخ است یا هر چیزه دیگر,فقط زمانیکه Sql توابع مقایسه ای را میبیند,چه حروف باشد چه عدد,با توجه به کد اسکی آنها,آنها را با هم مقایسه میکنید و نتیجه را برمیگرداند ولی اگر نوع فیلد از نوع Date تعریف شده باشد,در هنگام مقایسه تاریخها,Sql با توجه به فرمت تعریف شده برای تاریخ,عمل مقایسه را انجام میدهد و نتیجه را برمیگرداند.