PDA

View Full Version : سوال: وارد کردن اطلاعات به صورت تاریخ به SQL



mina.net
چهارشنبه 28 اسفند 1387, 08:51 صبح
سلام دوستان
من یک
DateTimePickerفارسی در برنامه ام دارم که وقتی تاریخ را به صورت شمسی در SQL ذخیره می کنم اعمال نمی شه یعنی یک پیام خطا ظاهر می شه مبنی بر اینکه محدوده زمانی این تاریخ صحیح نیست.
من یک کاری کردم تاریخ سال شمسی را بعلاوه 600 سال کردم در بانکم ذخیره کردم .
حالا برای گزارش گیری می خوام تاریخ منهای 600 سال نشون داده بشه. اگه کسی دستور SQL برای کم کردن از تاریخ بلد هست لطفا راهنمایی کنه ممنون می شم.
البته من DateTimePicker را از همین سایت دانلود کردم یادم نیست کی این برنامه رو گذاشته وگرنه از خودش می پرسیدم. اسم این کنترل PersianDatetimePicker_Usc هست.

salehbagheri
چهارشنبه 28 اسفند 1387, 09:34 صبح
وقتی تاریخ را به صورت شمسی در SQL ذخیره می کنم اعمال نمی شه یعنی یک پیام خطا ظاهر می شه مبنی بر اینکه محدوده زمانی این تاریخ صحیح نیست.


دوست عزيز! نوع يا Type مربوط به سلول اين قسمت رو از Datetime به nvarchar تغيير دهيد!
چون وقتي از تاريخ ميلادي استفاده نميكنيد دليلي نداره كه از اين نوع داده براي سلول جدولتون استفاده كنيد!

با اين كار ديگه نيازي نيست كه با 600 جمع كنيد و ...!

فقط تنها مشكلش اينكه به راحتي نميتونيد تغييري در تاريخ ايجاد كنيد!

mina.net
چهارشنبه 28 اسفند 1387, 10:46 صبح
دوست عزيز! نوع يا Type مربوط به سلول اين قسمت رو از Datetime به nvarchar تغيير دهيد!
چون وقتي از تاريخ ميلادي استفاده نميكنيد دليلي نداره كه از اين نوع داده براي سلول جدولتون استفاده كنيد!

با اين كار ديگه نيازي نيست كه با 600 جمع كنيد و ...!

فقط تنها مشكلش اينكه به راحتي نميتونيد تغييري در تاريخ ايجاد كنيد!
دوست عزیز از راهنمای شما ممنون ولی تمام مشکل من هم از اینه که اگه من با nvarchar ذخیره کنم نمی تونم براساس تاریخ ردیف کنم و یا از یک فاصله زمانی select کنم . لطفا بگید چطور می تونم از سال در SQL کم یا اضافه کنم. در ضمن نوع فیلد من در SQL از نوع datetime هست.

ali_md110
چهارشنبه 28 اسفند 1387, 13:33 عصر
سلام دوست
به نظز من شما فیلد تاریخ بانکتون رو از همون نوع DateTime بسازید هنگام درج تاریخ توسط برنامه کاربردی تاریخ شمسی رو به تاریخ میلادی تبدیل کنید تا تاریخ میلادی در بانک زخیره بشه و هروقت خواستید به کاربر تاربخ رو نمایش بدید تاریخ میلادی که در بانک ذخیره شده به تاریخ شمسی تبدیل و نمایش بدید کلاس PersianCalendar این تبدیلها رو به راحتی انجام میده

anooshiran
چهارشنبه 28 اسفند 1387, 13:51 عصر
سلام دوست عزيز

من هم با نظر دوستمون salehbagheri موافقم كه شما تاريخ را به صورت NVarVhar ذخيره كنيد.

ببينيد من خودم هم از همين روش استفاده مي كنم و هيچ مشكلي هم حتي براي رديف كردن بر اساس تاريخ نداشته ام.
من تاريخ را يدون / ذخيره مي كنم با طول 8 بدين صورت 13870512 .
بنابراين توجه كنيد كه شما فقط يك عدد خواهيد داشت كه ميتوانيد بر اساس آن هرنوع دستيابي را به راحتي داشته باشيد. وقتي هم مي خواهم تاريخ را نشان دهم مميزها را به آن اضافه مي كنم. ببينيد براي تاريخ فارسي شايد اين راحتترين راه حل باشد. هر چند راه حل هاي ديگري هم هست.

mina.net
چهارشنبه 28 اسفند 1387, 14:57 عصر
سلام دوست عزيز

من هم با نظر دوستمون salehbagheri موافقم كه شما تاريخ را به صورت NVarVhar ذخيره كنيد.

ببينيد من خودم هم از همين روش استفاده مي كنم و هيچ مشكلي هم حتي براي رديف كردن بر اساس تاريخ نداشته ام.
من تاريخ را يدون / ذخيره مي كنم با طول 8 بدين صورت 13870512 .
بنابراين توجه كنيد كه شما فقط يك عدد خواهيد داشت كه ميتوانيد بر اساس آن هرنوع دستيابي را به راحتي داشته باشيد. وقتي هم مي خواهم تاريخ را نشان دهم مميزها را به آن اضافه مي كنم. ببينيد براي تاريخ فارسي شايد اين راحتترين راه حل باشد. هر چند راه حل هاي ديگري هم هست.
سلام مجدد
روشی که شما (anooshiran ) می گید با روش دوست قبلی مون اندکی فرق می کنه که البته همون اندک مشکل منو حل می کنه . درسته اگه ما / رو برداریم می تونیم اونا رو مرتب کنیم.
خوب حالا ما چطور دستور select بنویسیم که این / رو دوباره بزاره البته من با کد نویسی این کارو کردم ولی برای من درسر زیادی داشت اگه بخوایم فقط با select این کارو انجام بدیم باید چیکار کرد.
در ضمن برای این که تاریخ میلادی رو به شمسی تبدیل کنیم راهشو می دونم اما برعکس نمی دونم لطفا توضیح بدید . در ضمن ایا می شه در دستورات sql کار رو راهت تر انجام داد.

ممنون از توجه ای که دارید.

anooshiran
چهارشنبه 28 اسفند 1387, 15:09 عصر
سلام دوست عزيز

كامپوننتي كه براي تبديلات در سايت گذاشتم امكان تبديل شمسي به ميلادي رو هم به شما ميده.
به هر حال من كد تبديل شمسي به ميلادي رو يرات ميذارم




Public Shared Function PersianToGregorian(ByVal [Date] As String) As String
Dim pDate As New PersianCalendar
Dim spl = Split([Date], "/")
If spl(0).ToString.Length < 4 Then
If spl(0).ToString.Length = 3 Then
spl(0) = "1" & spl(0)
End If
If spl(0).ToString.Length = 2 Then
spl(0) = "13" & spl(0)
End If
End If
Dim year As Integer = CInt(spl(0))
Dim month As Integer = CInt(spl(1))
Dim day As Integer = CInt(spl(2))

Return Mid(pDate.ToDateTime(year, month, day, 0, 0, 0, 0, PersianCalendar.PersianEra), 1, 10)
End Function



در مورد select هم لطف كن كد كارتو بزار ببينم

mina.net
چهارشنبه 28 اسفند 1387, 15:20 عصر
ممنون از توجه شما
من یک select می خوام از بانکم داشته باشم. به نحوی که علامت / رو برای تاریخی که به صورت عدد وارد کردم دوباره بزاره. بدون اینکه مجبور باشم یکی یکی این کارو بکونم.
و یا به جای عدد تاریخ میلادی وارد کنم و سپس هنگام select کردن از بانک دوباره اونو تبدیل به تاریخ شمسی کنم.
در ضمن من فکر می کنم نامی که برای تاریخ ایران به کار می بریم درست نباشه تاریخ میلادی هم شمسی هست منتها میلادی شمسی و ما هجری شمسی ولی خوب اینطوری جا افتاده محض اطلاع !!

anooshiran
چهارشنبه 28 اسفند 1387, 16:07 عصر
سلام دوست عزيز

با اين كد ميتوني / را به تاريخت در select اضافه كني . فقط توجه كن كه مجبوري حتما اسم جديدي براي اين فيلد بگذلري كه من از NewDate استفاده كرده ام. اين متد Alias Name نام دارد.



"SELECT SubString(_Date,1,4) + '/' + SubString(_Date,5,2) + '/' + SubString(_Date,7,2) AS NewDate FROM " & dataBaseName & TableName


در ضمن ميلادي يا هجري مبدا تاريخ هستند . خورشيدي يعني يك دور گردش كامل زمين به دور خورشيد. به همين دليل است كه ما هيچ وقت زمان ثابت تحويل سال نداريم. ولي در ناريخ ميلادي زمان تحويا سال قراردادي است . بنابر اين به تعريف دقيق نمي توان به آن شمسي گفت زيرا زمان تحويل سال گردش يا كامل انجام نشده يا فراتر رفته.

باز هم اكر در مورد كد مشكل داشتي در خدمت هستم.

mina.net
چهارشنبه 28 اسفند 1387, 17:23 عصر
سلام دوست عزيز

با اين كد ميتوني / را به تاريخت در select اضافه كني . فقط توجه كن كه مجبوري حتما اسم جديدي براي اين فيلد بگذلري كه من از NewDate استفاده كرده ام. اين متد Alias Name نام دارد.



"SELECT SubString(_Date,1,4) + '/' + SubString(_Date,5,2) + '/' + SubString(_Date,7,2) AS NewDate FROM " & dataBaseName & TableName


در ضمن ميلادي يا هجري مبدا تاريخ هستند . خورشيدي يعني يك دور گردش كامل زمين به دور خورشيد. به همين دليل است كه ما هيچ وقت زمان ثابت تحويل سال نداريم. ولي در ناريخ ميلادي زمان تحويا سال قراردادي است . بنابر اين به تعريف دقيق نمي توان به آن شمسي گفت زيرا زمان تحويل سال گردش يا كامل انجام نشده يا فراتر رفته.

باز هم اكر در مورد كد مشكل داشتي در خدمت هستم.
جناب anooshiran (http://www.barnamenevis.org/forum/member.php?u=54421) واقعا دست درد نکنه خیلی خوب بود. از این کامل تر نمی شد.
در ضمن تاریخ میلادی هم برای اساس گردش زمین دور خورشد هست هر چند با چند ساعت اختلاف. به هر حال ممنون از توجه و مساعدتی که فرمودید.