PDA

View Full Version : DateTme در C# و DateTime در SQL Server 2008



odiseh
سه شنبه 05 آذر 1392, 09:55 صبح
سلام به دوستان

من یک table دارم در SQL Server ام که یکی از فیلدهای اون از نوع DataTime هستش. وقتی اون رو داخل برنامه ام می خونم فرمتش تغییر می کنه و حروف ب.ظ و یا ق.ظ به آخرش اضافه می شه.

چیزی که من دنبالش هستم اینه که فرمتش حفظ بشه و حتی بخش milisecond اون هم داخل برنامه در دسترس باشه.

چطوری می تونم اینکار رو انجام بدم؟ نمی خوام فرمتش تغییر کنه.

armira
سه شنبه 05 آذر 1392, 10:15 صبح
سلام
شما اول بگو با تاریخ میلادی کار میکنی یا شمسی؟ اگه میلادی استفاده میکنی من از طریق کدهای زیر به چیزی که شما میخوای رسیدم . برای شمسی هم از همین روش میشه استفاده کرد و اینکه راه ساده تر دیگری هم وجود داره یا نه من جستجو نکردم .


string myDateTime = Convert.ToString(DateTime.Now.Year) +"/"+
Convert.ToString(DateTime.Now.Month)+"/"+
Convert.ToString(DateTime.Now.Day)+" "+
Convert.ToString(DateTime.Now.Hour)+":"+
Convert.ToString(DateTime.Now.Minute)+":"+
Convert.ToString(DateTime.Now.Second);
textBox1.Text = myDateTime;

odiseh
سه شنبه 05 آذر 1392, 12:55 عصر
سلام
شما اول بگو با تاریخ میلادی کار میکنی یا شمسی؟ اگه میلادی استفاده میکنی من از طریق کدهای زیر به چیزی که شما میخوای رسیدم . برای شمسی هم از همین روش میشه استفاده کرد و اینکه راه ساده تر دیگری هم وجود داره یا نه من جستجو نکردم .


string myDateTime = Convert.ToString(DateTime.Now.Year) +"/"+
Convert.ToString(DateTime.Now.Month)+"/"+
Convert.ToString(DateTime.Now.Day)+" "+
Convert.ToString(DateTime.Now.Hour)+":"+
Convert.ToString(DateTime.Now.Minute)+":"+
Convert.ToString(DateTime.Now.Second);
textBox1.Text = myDateTime;


من با تاریخ میلادی کار می کنم. کاری که شما انجام می دی تبدیل به تایپ string هستش..... ببین من دقیقا همون مقداری رو که توی SQL server برای ثبت فیلد DateTime نشون می ده رو "دقیقا" همون رو با ماهیت تاریخ میلادی توی برنامه ام می خوام (تاکید من روی بخش Milisecond زمانش هستش)

debugger
سه شنبه 05 آذر 1392, 12:59 عصر
عزیزم نوع فیلدتو تو sql از نوع nvarchar(50) بگیر

armira
سه شنبه 05 آذر 1392, 14:07 عصر
طبق گفته ی دوست عزیزمون جناب debugger باید نوع فیلدت رو nvarchar(50) در نظر بگیری . حالا 50 نه کمتر هم میتونی مثلا 20 . اینطوری دقیقا همه ی اون چیزی که میخوای در دسترست هست.

odiseh
سه شنبه 05 آذر 1392, 15:51 عصر
تشکر از توضیحاتتون . پس اینطور که معلومه نمیشه توی DB هم فیلد رو از نوع DateTime در نظر گرفت. به عبارتی دریافت مقادیر (از نوع DateTime) از بانک اطلاعاتی و آوردنش داخل برنامه تحت هر شرایطی باعث تغییر فرمت اون میشه درسته؟ من درست متوجه شدم از راهنمایی هاتون؟

armira
سه شنبه 05 آذر 1392, 15:56 عصر
ببین دوست عزیز نوع DateTime فرمتش همونی هست که تو برنامت یا توی بانکت دیدی . چون میخوای فرمتش دلخواه خودت باشه یا به عبارتی همون اطلاعاتی که تو از تاریخ و زمان میخوای رو به همون صورتی که تو میخوای نشون بده پس باید خودت اون رو بسازی . برای این کار یک فیلد از نوع nvarchar یا varchar(اگه فقط با تاریخ میلادی کار میکنی) در نظر بگیر و با دستوراتی که گفته شد همون خروجی که مد نظرت هست رو تولید کن و در دیتابیس ذخیره کن . موفق باشی .

plus
سه شنبه 05 آذر 1392, 16:23 عصر
تشکر از توضیحاتتون . پس اینطور که معلومه نمیشه توی DB هم فیلد رو از نوع DateTime در نظر گرفت. به عبارتی دریافت مقادیر (از نوع DateTime) از بانک اطلاعاتی و آوردنش داخل برنامه تحت هر شرایطی باعث تغییر فرمت اون میشه درسته؟ من درست متوجه شدم از راهنمایی هاتون؟

وقتی شما فیلد رو DateTime میگیری و مقداری رو درش ذخیره میکنی، شما داری مقدار اون 'لحظه' رو در دیتابیس ذخیره میکنی و موقع بازیابی هم همون مقدار رو به صورت متغیر DateTime (که شامل Millisecond هم میشه) رو دریافت میکنی. موضوع این هست که شما باید عمل فرمت کردن رو در نرم افزار مدیریت کنی و بهتره کاری به دیتابیس در این مورد نداشته باشی...دیتابیس فقط مقدار اون 'لحظه' رو بدون هیچ تغییری برای شما نگه داری میکنه.
حروف ب.ظ و غیره هم مربوط به فرمت تاریخ میشه.شما بعد از دریافت تاریخ تحت عنوان یک متغیر DateTime، میتونید به هر نحوی که میخواین اون رو فرمت کنید.

odiseh
چهارشنبه 06 آذر 1392, 09:51 صبح
موقع بازیابی هم همون مقدار رو به صورت متغیر DateTime (که شامل Millisecond هم میشه) رو دریافت میکنی.


نه دیگه موضوع دقیقا همین قسمته..... چون این اتقاف نمی افته و بخش Milisecond اش توی برنامه حذف میشه و حروف ب.ظ و یا ق.ظ. اضافه میشه. من دقیقا همونی رو که شما اشاره کردی رو می خوام که نمیشه ظاهرا!

plus
چهارشنبه 06 آذر 1392, 14:41 عصر
نه دیگه موضوع دقیقا همین قسمته..... چون این اتقاف نمی افته و بخش Milisecond اش توی برنامه حذف میشه و حروف ب.ظ و یا ق.ظ. اضافه میشه. من دقیقا همونی رو که شما اشاره کردی رو می خوام که نمیشه ظاهرا!
بررسی کردم، بخش MilliSecond حذف نمیشه ولی کمی (با دقت 1/333 ثانیه) گرد میشه.مثلا 125 رو 127 نگه میداره.حروف ب.ظ و ... هم که قبلا گفتم مربوط به فرمت تاریخ هست و ربطی به چیزی که واقعا نگهداری میشه نداره...

SqlConnection conn = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand("UPDATE tblTest SET Time=@Time", conn);
cmd.Parameters.Add(new SqlParameter("Time", new DateTime(2013, 1, 1, 10, 15, 20, 998)));
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();


SqlCommand retCmd = new SqlCommand("SELECT TOP(1) Time FROM tblTest", conn);
conn.Open();
DateTime time = (DateTime)retCmd.ExecuteScalar();
conn.Close();

در صورتی که شما از SQL Server 2008 یا بالاتر استفاده کنید، میتونید از نوع datetime2 استفاده کنید که دقت اون 100 نانو ثانیه هست و بنابراین نباید دیگه میلی ثانیه رو گرد کنه...

odiseh
شنبه 09 آذر 1392, 10:19 صبح
سلام دوستان
من مشکلم رو اینطوری بالاخره حلش کردم
1- توی Table یه فیلد با نام CreateDate با تایپ Datetime ایجاد کردم
2- یک view از Table ام درست کردم و توش علاوه بر همه فیلدهای Table، یک فیلد محاسباتی مبتنی بر CreateDate با فرمت varchar و با پارامتر 121 و استفاده از تابع Convert :
Convert(varchar, CreateDate, 121)
3- توی Appl. ، حالا من با فیلدی با فرمت string کار می کنم و مشکلی ندارم.