PDA

View Full Version : تبدیل نوع int به تاریخ شمسی در sqlserver



arya_system_bar
دوشنبه 30 تیر 1393, 15:42 عصر
با سلام
من دو فیلد تاریخa و تاریخ b دارم که تو اس کیو ال سرور از نوع int تعریف شده .حالا می خوام یه تابع بنویسم که اون رو به صورت تاریخ شمسی نشون بده تا بتونم تفاضل دو تاریخ از هم کم کنم
چطور میشه این کار انجام داد

kahe.mehrdad
دوشنبه 30 تیر 1393, 15:52 عصر
چرا این کار را سمت کد انجام نمیدید؟ با در آوردن property های هر Date میتونید با یک الگوریتم ساده اونها را از هم کم کنید و تفاضل را بر حسب تعداد روز بدست بیارید. منظورتون را از اینکه تاریخ رو از نوع int تعریف کردید متوجه نشدم. میشه واضح تر بگید؟

arya_system_bar
دوشنبه 30 تیر 1393, 23:29 عصر
سلام
منظورم اینه وقتی فیلد های تاریخ رو تعریف شده از نوع int شده.حالا میخوام از هم کم کنم مثل دو عدد صحیح از هم کم می شود
tarikha=930221
tarikhb=930430
این دوتا رو چجوری بصورت تاری از هم کم کنم

kahe.mehrdad
سه شنبه 31 تیر 1393, 08:40 صبح
ببینید شما وقتی تاریخ را از نوع datetime تعریف کنید غیر ممکنه اینجوری که شما میگید نشونش بده. جدولتون را نگاه کنید ببینید فیلد تایپ تاریخ هاتون را چه جوری تعریف کردید؟
البته سمت کد هم میشه تاریخ ها بالا را از هم کم کرد فقط یه خورده فنیه، بسته به تواناییتونه البته کار خیلی سختی هم نیست. مثلا از الگوریتم زیر میتونید کمک بگیرید:

تاریخ a را بگیر و توی یک متغیر int کمکی بریز به نام temp_a
مود 100 متغییر temp_a را حساب کن و توی متغییر day_a بریز. الان شما روز تاریخ a را داری.
حالا temp_a را تقسیم بر 100 کن تا روز ها بره و توی خودش بریز
حالا دوباره مود 100 temp_a را حساب کن و توی متغییر month_a بریز. اینم از ماه a
دوباره temp_a=temp_a/100
حالا هر چی میمونه میشه year تاریخ a

اگه واسه تاریخ b هم همینکارو کنی روز و ماه و سال را در بیاری دیگه اختلاف اون دو تا رو در آوردن کار سختی نیست. ولی به نظر من داری تو دیتابیست یه کارایی را اشتباه انجام میدی دوست من.

ham3d1988
سه شنبه 31 تیر 1393, 10:42 صبح
با توجه به اینکه ما توی تاریخ ها گاهی اوقات اسفند 29 و 30 روزه داریم محاسباتتون پیچیده میشه در حالیکه که با ذخیره کردن نوع datetime به راحتی می تونید از همه ی این مشکلات با استفاده از دوتا مبدل شمسی به میلادی و برعکس توی DB خلاص بشید
بهتره شما این کارو بکنید
اول تاریخ هایی که ذخیره کردید رو با استفاده از char index و SubString تبدیل به رشته ای بصورت 1393/05/15 بکنید
بعدش با استفاده از توابعی که اینجا هستش:
http://barnamenevis.org/showthread.php?52880-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%B1%D9%88-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%DA%A9%D9%86%D9%85-%D8%A8%D9%88%D8%B3%DB%8C%D9%84%D9%87-sql-%D8%9F&p=267664#post267664
اونها رو تبدیل به نوع datetime کرده و یه فیلد براش در نظر بگیرید و ذخیره کنید
اینجوری با استفاده از توابعی تاریخی که توی sql server دارید به راحتی میتونید روی تاریخ ها تفاضل و ...رو انجام بدید

kahe.mehrdad
سه شنبه 31 تیر 1393, 16:04 عصر
من هم موافقم. دوستمون درست میگن. شما برای تبدیل تاریخ هاتون به فارسی میتونید از namespace های persianCalender استفاده کنید.