PDA

View Full Version : خطا در ذخیره تاریخ شمسی در دیتابیس



rezaiy.ali
شنبه 24 شهریور 1386, 17:28 عصر
با سلام
من زمانی که می خوام تاریخ شمسی را داخل دیتابیس ذخیره کنم خطای
Failed to convert parameter value from a String to a DateTime.
میگره
من از تابع convert.ToDateTime( Data.Text) استفاده کردم اما باز هم نشد.
لطفا راهنمایی بفرمایید.
متشکرم

choobin84
شنبه 24 شهریور 1386, 19:13 عصر
با سلام
من زمانی که می خوام تاریخ شمسی را داخل دیتابیس ذخیره کنم خطای
Failed to convert parameter value from a String to a DateTime.
میگره
من از تابع convert.ToDateTime( Data.Text) استفاده کردم اما باز هم نشد.
لطفا راهنمایی بفرمایید.
متشکرم

ضرورتی به ذخیره تاریخ به صورت نوع date وجود نداره ، اونو از نوع char ذخیره کنید

محسن بابائی
شنبه 24 شهریور 1386, 21:57 عصر
حق با choobin عزیز هست .
معمولا تمامی برنامه نویسان فیلد های تاریخ و ساعت را از نوع رشته ای می گیرند .

omidmehraban
یک شنبه 25 شهریور 1386, 23:56 عصر
بخاطر اینکه ترتیب ماه های شمسی با میلادی یکی نیست یعنی ماه دوم شمسی 31 روز ولی ماه دوم میلادی 28 روز.البته اگر تاریخ شما تو این رنج باشه.
پیشنهاد دوستامون درسته من هم همین کارو میکنم.

__H2__
سه شنبه 27 شهریور 1386, 09:45 صبح
سلام
پیشنهاد شخصی من ذخیره و محاسبه و خواندن به حالت میلادی است!
ولی در زمان نمایش یا زمان گرفتن از کاربر آنرا از میلادی به شمسی و تا بلعکس تبدیل کنید.
یعنی یک تبدیل در زان گرفتن و یک تبدیل در زمان نمایش و بقیه میلادی.

sinpin
سه شنبه 27 شهریور 1386, 09:53 صبح
سلام
پیشنهاد شخصی من ذخیره و محاسبه و خواندن به حالت میلادی است!
ولی در زمان نمایش یا زمان گرفتن از کاربر آنرا از میلادی به شمسی و تا بلعکس تبدیل کنید.
یعنی یک تبدیل در زان گرفتن و یک تبدیل در زمان نمایش و بقیه میلادی.

اگه تعداد رکوردها خیلی زیاد نباشه :
پیشنهاد من ذخیره بصورت هر دو شکل شمسی و میلادی است

art2000ir
چهارشنبه 28 شهریور 1386, 07:34 صبح
اگر به صورتی که دوستان گفتند که char ذخیره کنیم هنگام سرچ به مشکلی بر نمی خوریم ؟؟؟؟

محسن بابائی
چهارشنبه 28 شهریور 1386, 08:15 صبح
اگر به صورتی که دوستان گفتند که char ذخیره کنیم هنگام سرچ به مشکلی بر نمی خوریم ؟؟؟؟

هیچ مشکلی بوجود نمیاد .

rezaiy.ali
چهارشنبه 28 شهریور 1386, 09:11 صبح
ضمن تشکر از همه دوستان که راهنمایی فرمودن
لطفا بفرمایید که چطور میشه تاریخ میلادی را که از دیتابیس خوانده میشه به تاریخ شمسی تبدیل کرد
متشکرم

حامد مصافی
چهارشنبه 28 شهریور 1386, 14:42 عصر
برای این کار قبلاً کامپوننت هایی در این سایت معرفی شدند. فقط کافیه بگردید.

اما مواقعی نیاز دارید تا یک شمای جدولی از یک پایگاه داده رو مستقیماً به کار بگیرید (مثل گزارش گیری) در این مواقع می خواهید تمام تاریخ ها رو یک به یک تبدیل کنید؟ من به شخصه تاریخ رو هم به صورت قابل احتساب (عددی) و هم به صورت قابل نمایش (شمسی رشته ای) ذخیره می کنم.

niksoft
چهارشنبه 28 شهریور 1386, 20:09 عصر
من چند وقت پیش به همین مشکل برخورد کردم چون تاریخ رو از نوع Char گرفته بودم و تعداد رکوردها بالا بودم زمان گزارش گیری بالا رفته بود و به TimeOut می خوردم (فراموش نکنید که یک فیلد از نوع (10)char بیست بایت فضا میگیرد ولی smalldatetime هشت بایت فضا اشغال میکند )
تنها راهی که مشکل ما را حل کرد این بود که پس از پر کردن Dataset که حاوی تاریخ میلادی است آن را به Dataset ی جدید با تاریخ شمسی تبدیل میکردیم و دیتا ست جدید رو به Report Viewer میدادیم

__H2__
شنبه 31 شهریور 1386, 10:56 صبح
سلام
فقط یک یادآوری کوچک!
SQL Server 2005 میتواند از اسمبلی های دات نت به عنوان توابع داخلی استفاده کنید.
و نتیجه اخلاقی آنکه اگر SQL Server 2005 داشته باشید میتوانید به راحتی دو تابع تبدیل میلادی به شمسی String و بلعکس درست کنید و ...

delbarir
دوشنبه 02 مهر 1386, 11:39 صبح
سلام من یه سری کد دارم که شاید به درد شما بخوره فقط باید یکم با اون ور بری و تغییرات لازم رو برای خودت بدی.

1- اول اینا رو باید تعریف کنی

type
TYMD = Packed record
YY: Byte;
MM: Byte;
DD: Byte;
end;
TLeapYear = Set of Byte;
TMonthLen = Array[1..12] of Byte;

2- این مقادیر ثابت رو هم تعریف کن
const
DeferDay = 35143;
ZYMD: TYMD = (YY:0;MM:0;DD:0);
LeapYear: TLeapYear = [75,79,83,87,91,95,99,103,107,111,115,119,123,127,1 31,135];
MonthLen: TMonthLen = (31,31,31,31,31,31,30,30,30,30,30,30);

3- و در نهایت این هم کدی که تاریخ فعلی سیستم رو از میلادی به شمسی تبدیل می کنه


function FDate(x: integer): TYMD;
var
i,j: integer;
x : Integer;
begin
x := Trunc(Now);
x := x - DeferDay;
if x < 0 then
begin
Result := ZYMD;
exit;
end;
i := 74;
Repeat
inc(i);
if i in LeapYear then
j := 366
else
j := 365;
x := x - j;
Until x <= 0;
x := x + j;
Result.YY := i;
i := 0;
Repeat
inc(i);
x := x - MonthLen[i];
Until x <= 0;
Result.MM := i;
Result.DD := x + MonthLen[i];
end;

choobin84
سه شنبه 03 مهر 1386, 04:31 صبح
من چند وقت پیش به همین مشکل برخورد کردم چون تاریخ رو از نوع Char گرفته بودم و تعداد رکوردها بالا بودم زمان گزارش گیری بالا رفته بود و به TimeOut می خوردم (فراموش نکنید که یک فیلد از نوع (10)char بیست بایت فضا میگیرد ولی smalldatetime هشت بایت فضا اشغال میکند )
تنها راهی که مشکل ما را حل کرد این بود که پس از پر کردن Dataset که حاوی تاریخ میلادی است آن را به Dataset ی جدید با تاریخ شمسی تبدیل میکردیم و دیتا ست جدید رو به Report Viewer میدادیم

من فکر نمی کنم timeout مربوط به تاریخی باشه که به تعداد 10 کاراکتر فضا اشغال می کنه. چیزی که درمقایسه با متون و سایر فیلدها کوچ به نظر میرسه.
نکته ای که هست اینه که سرباز ناشی از تبدیل تاریخ میلادی به شمسی و برعکس که بیشتر از timeout مشکل سازه.
یکبار باید تاریخ خونده بشه، به شمسی تبدیل بشه، و دوباره باید تاریخ به میلادی تبدیل بشه و در انک ذخیره بشه.
برای گزارشگیری با رکوردهای زیاد ، متاسفانه کفر آدم بالا میاد

hamid59022
دوشنبه 04 آذر 1392, 13:45 عصر
با عرض معذرت چرا نمي شود تاريخ را بصورت عددي در ديتابيس ذخيره كرد بصورت int16 كه چهاربايت اشغال مي كند و سرعت سرچ در اون خيلي زياده كافيه ورودي ها را كه از سه تكست باكس كنار هم دريافت مي كنيم با هم ادغام كنيم

behrooz69
چهارشنبه 06 آذر 1392, 02:32 صبح
سلام . دوست من همونور که همه دوستام گفتن از نوع Datetime یا Date بگیری با مشکلی 31 روزه بودن شمسی ما بر می خوری . شما برای ورود اطلاعاتت می تونی از DLL پرشین کالندر که تو همین فروم موجوده و من چند روز پیش واسه یکی از دوستان گذاشتم و راجب ورود تاریخ و روز و ساعت توضیح کامل دادم استفاده کنی .

و همچنین به جای char از Nvarchar استفاده کن . که بعدا تو گزارش گیری و حتی ارسال به گرید ویو به مشکل نخوری .

در ضمن دوستان وقتی برنامه فارسی نیاز به تاریخ میلادی نیست .
اگه هم نیاز باشه خود vb.net تاریخ میلادی رو داره اگه واسه نمایش بخوایم .

و وقتی با این کد میشه تاریخ رو هم به صورت عدد یا حروف تو 1 لیبل نوشت نیاز به نوشتن 100 خط کد نیست
LblTarikhJari.Text = HM_FarsiCalendar.FarsiDate.FarsiToday.FullNameDate

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

فقط کافیه Dll رو به رفرنس پروژتون اضافه کنین که اونم وقتی استفاده کنین خودش می شه .