نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
نقل قول:
نوشته شده توسط
Arghavan_Reza
ساده است!
بدون اینکه به این فکر کنید که سال کبیسه در سیستم های میلادی و شمسی کی است و چه ارتباطی با هم دارند و شروع سال میلادی در چه تاریخی از سال شمسی اتفاق می افتد یا بالعکس یا مثلا ماه های میلادی هر کدام چند روز است یا ... به این مسئله توجه کنید که تعداد روزهایی که از مبدا (یا مثلا 1/1/1279 شمسی یا 20/3/1900 میلادی ) تا الان (یا هر تاریخ مشخص دیگری) گذشته است در هر دو سیستم یکسان است. (شاید جابجایی سال کبیسه در سال 1375 شمسی به همین دلیل باشد.)
و من الله توفیق ...
تعداد روزهای گذشته از مبدا برای همه تقویم ها یکسان هست و این پایه تبدیل تقویم ها به یکدیگر هست یعنی در تمام مبدلهای تقویم یک روز را مبدا فرض می کنند مثلا 1/1/1900 روز صفرم هست. حالا تعداد روزهای گذشته از این تقویم را داشته باشید می توانید به تقویم مورد نظر تبدیل کنید.
حالا فرض کن روز 1/1/1900 روز صفرم تقویم ما باشد، حالا من می خواهم شما بفرمایید که روز 42148 ام را چگونه به تقویم شمسی و میلادی تبدیل می کنید؟
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
نقل قول:
حالا فرض کن روز 1/1/1900 روز صفرم تقویم ما باشد، حالا من می خواهم شما بفرمایید که روز 42148 ام را چگونه به تقویم شمسی و میلادی تبدیل می کنید؟
محاسبه تعداد روزهای گذشته (42148) بخشی از وظیفه این توابع است، خیلی سخت نگیرید. می دانم برای آشنایی دیگران سوال کرده اید:
نقل قول:
در مورد این الگوریتم توضیحی میدی؟
و حتما الگوریتم توابع فوق را خوب فهمیده اید.
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
با سلام و تشکر از همه دوستان و بحث هایی که بسیار مفید هستند.
روش های متفاوتی مطرح شدند، در مورد روش sqlpro اضافه کردن یک فیلدchar 10 مهندسی نرم افزار را زیر سوال نبرده و باعث آنرمال شدن جداول نمی گردد.چون اصول نرمال سازی نسبی هستند و تئوریک و در بسیاری از مواقع CostBenefit در دنیای واقعی ما را به استفاده از روش های غیرقانونمند هدایت می کند.و باید هدف از نرمال سازی را بدانیم و در جاهایی که نیاز است رعایت کنیم.
همچنین من یک نکته که خودم رعایت میکنم را به مطالب شما اضافه می کنم.چون بیشترین حالت استفاده از sql معماری کلاینت سرور است بهتر است بجای وارد کردن بار تبدیل تاریخ به sql تبدیل را در سطح UI انجام دهید و این یعنی تقسیم بار محاسبه به کلاینت ها
در ضمن استفاده از جدول تاریخ های فارسی و join آن و ایجاد یک view نیز روش خوبی برای استفاده در سطح sql است.البته معماری برنامه در انتخاب روش تبدیل تاریخ موثر است.
از همه بابت نظراتشان متشکرم.
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
نقل قول:
نوشته شده توسط
hamed-p
اون Function ايي كه من گذاشتم فقط براي آخرين روز سال كبيسه يعني 30 اسفند درست كار نميكند ولي براي 29 اسفند درست كار ميكنه
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
سلام
من مشکلی که دارم این هست که متاسفانه 360000 تاریخ شمسی دارم که به صورت رشته در جدول ذخیره شده.از طرفی نرم افزاری که من دارم استفاده می کنم فقط تاریخ میلادی رو میشناسه. کل این جریان هم رو وب هست پس باید قبل از upload تاریخ ها رو درست کنم.
و اکر از الگوریتم استفاده کنم زمان load میره بالا ، اگر میتونین لطفاکمکم کنین تا این رشته ها رو به تاریخ میلادی تبدیل کنم در ضمن اگر کسی سورس هم تو سی شارپ داره برام بذاره ممنون می شم. بزرگترین مشکلم هم اینه که سیستم اجازه دستکاری تو داده با فرمت تاریخ رو بهم نمی ده ممنون
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
سلام رفقا
امروز بعد از تقریبا 2 سال مجدد تو این تاپیک اومدم ، تقریبا 2 سال پیش با استفاده از کدی که کاربر Linux گزاشته بود تو برنامه هام شروع به کار کردم و کد بسیار سریع و خوب اجرا میشه .
تقریبا میشه گفت هیچ مشکلی باهاش ندارم
بزرگترین ویو ما که اطلاعات کل سیستم رو نشون میده 32 هزار رکورد داره که با لحاظ کردن Union All حدود 30 جدوم و سورت بر روی فیلد تاریخ و تبدیل تاریخ میلادی به شمسی حدود 2 ثانیه طول میکشه که تمام داده ها رو لود کنه .
و اما منظورم من از ارسال این پست ، نکته ای که به نظرم رسید میتونه مفید باشه اینه که در اکثر موارد داد های من و اکثر کاربران دیگر بصورت ذیل است :
01/01/2001
01/01/2001
01/01/2001
01/01/2001
01/01/2001
01/01/2001
...
02/01/2001
02/01/2001
...
10/10/2001
اگر کمی دقت کنید میتوانیم این تابع را کمی بهینه تر کنیم ، بدین معنی که برای رکورد اول تابع تبدیل تاریخ را انجام بدهد و برای رکوردهای بعدی اگر تاریخ نیاز به محاسبه داشت مجدد این محاسبه انجام شود در غیر این صورت تاریخ محاسبه شده در رکورد قبلی بازیابی شود .
نمیدانم توانستم منظورم را برسانم یا نه ؟
اینگونه فرض کنید برای تاریخ 15/01/2010 این تابع را فراخوانی کرده ایم و این تابع محاسبات را انجام میدهد و در رکورد بعدی هم همین تاریخ (که در رکورد قبلی یک بار تبدیل شده بود) را باید مجدد تبدیل کنیم ، حال اگر بتوانیم مقدار تاریخ قبلی را در متغییری قرار دهیم مشکل رفع میگردد .
یعنی نیاز داریم در تابع 2 مقدار را ذخیره کنیم و بتوانیم در فراخوانی بعدی این مقادیر را بخوانیم ، یعنی یک چیزی تو مایه های متغییر های Static در C
به این شکل تقریبا میشه گفت سرعت تابع بیش از 2 برابر میشود
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
نقل قول:
نوشته شده توسط
bad_boy_2007
سلام رفقا
امروز بعد از تقریبا 2 سال مجدد تو این تاپیک اومدم ، تقریبا 2 سال پیش با استفاده از کدی که کاربر Linux گزاشته بود تو برنامه هام شروع به کار کردم و کد بسیار سریع و خوب اجرا میشه .
تقریبا میشه گفت هیچ مشکلی باهاش ندارم
بزرگترین ویو ما که اطلاعات کل سیستم رو نشون میده 32 هزار رکورد داره که با لحاظ کردن Union All حدود 30 جدوم و سورت بر روی فیلد تاریخ و تبدیل تاریخ میلادی به شمسی حدود 2 ثانیه طول میکشه که تمام داده ها رو لود کنه .
و اما منظورم من از ارسال این پست ، نکته ای که به نظرم رسید میتونه مفید باشه اینه که در اکثر موارد داد های من و اکثر کاربران دیگر بصورت ذیل است :
01/01/2001
01/01/2001
01/01/2001
01/01/2001
01/01/2001
01/01/2001
...
02/01/2001
02/01/2001
...
10/10/2001
اگر کمی دقت کنید میتوانیم این تابع را کمی بهینه تر کنیم ، بدین معنی که برای رکورد اول تابع تبدیل تاریخ را انجام بدهد و برای رکوردهای بعدی اگر تاریخ نیاز به محاسبه داشت مجدد این محاسبه انجام شود در غیر این صورت تاریخ محاسبه شده در رکورد قبلی بازیابی شود .
نمیدانم توانستم منظورم را برسانم یا نه ؟
اینگونه فرض کنید برای تاریخ 15/01/2010 این تابع را فراخوانی کرده ایم و این تابع محاسبات را انجام میدهد و در رکورد بعدی هم همین تاریخ (که در رکورد قبلی یک بار تبدیل شده بود) را باید مجدد تبدیل کنیم ، حال اگر بتوانیم مقدار تاریخ قبلی را در متغییری قرار دهیم مشکل رفع میگردد .
یعنی نیاز داریم در تابع 2 مقدار را ذخیره کنیم و بتوانیم در فراخوانی بعدی این مقادیر را بخوانیم ، یعنی یک چیزی تو مایه های متغییر های Static در C
به این شکل تقریبا میشه گفت سرعت تابع بیش از 2 برابر میشود
البته من این کد را برای sql sererv 2000 نوشته بودم که بعد ها با آمدن sql server 2005 و دات نت 2 با استفاده از کد های دات نت باز نویسی کردم.
چیزی که شما می خواهید در این تابع قابل انجام نیست. شما می توانید موقع صدا کردن این تابع این کنترل را انجام دهید. البته با دستورات sql هم راحت نیست.
1 ضمیمه
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
دوستان خواهش میکنم یک لحظه تامل کنید
بعضی دوستان یک جدول شمسی اظافه داشتند و با JOIN معادل شمسی یک تاریخ میلادی رو به دست میآوردند.
عده ای دیگه که از یک سری FUN استفاده کردند که کندی خود الگوریتم و خود FUN و Cache نشدن آن بسیار مسئله زاست.
بعضی ها اسم از VIEW آوردند که من نفهمیدم VIEW چه جوری قراره تو این سیستم کار کنه ؟
استفاده از Cursor برای افزایش رکوردهای جدول شمسی هم که نوبر بود.
---
دوستان مگر ما برنامه نویس پلتفرم Net. نیستیم ؟
خب ما یک کلاس داریم که در سمت کلاینت که تاریخ میلادی رو به تاریخ جلالی یا همون شمسی تبدیل میکنه.
و اصولا بحث بر سر کلاینت نیست.
خب با CLR Programming یک Type هم در سمت سرور درست کنیم مثلا با نام جلالی که در خودش تاریخ شمسی نگه داری کند.
هم سریع است.
هم اعتبارسنجی اش با خودش است.
هم میتوان یک سری متد به آن اظافه کرد؛ که مثلا نام کامل ماه را برگرداند و ... .
یه بنده خدایی چند صد سال قبل نشسته بدون هیچ امکاناتی مسائلی رو حساب کرده که هنوز که هنوزه اون محاسبات بالاترینه و تقویم ما دقیق ترین تقویم دنیاست.
تن اون بنده خدا رو تو قبر نلرزونیم.
تازه شما خودتون حساب کنید فرضا اگه این تاپیک ترجمه شه و بیفته دست یکسری مثلا هندی چه جوری مضحکه میشیم ؟
در نهایت برای اون سری از دوستانی که فعلا تاریخ میلادی دارند؛ میتونن یک سری کل میلادیهاشون رو بخونند و پس از تبدیل با کد C# در فیلد جلالی بنویسند.
و اونهایی که شمسی رو به صورت nchar10 ذخیره کردند؛ در همان کلاسی که تاریخ میلادی رو به شمسی تبدیل میکنه؛ میتونین شمسی رو به صورت سال و ماه و روز جدا بدید و میلادی تحویل بگیرید.
هر چند من خودم با extension method اینها رو به DateTime و SHAMSIUDT اظافه کردم.
دیگه به نظر من مشکلی نمی مونه جز اینکه اون تایپ جلالی.
باور کنید من اگر میتوانستم اون رو در اختیارتون میذاشتم. ولی چنین اختیاری ندارم.
اما کد C# اون رو در اختیارتون میذارم هر چند که با اطلاعاتی که در بعضی از دوستان میبینم میدونم کامل تر از این رو میتونند طراحی کنند؛ به چند دلیل :
در طراحی Validation جدی گرفته نشده چون من از کمپوننت DateTime Picker استفاده میکنم هم برای شمسی، هم برای جلالی و اونها به خوبی مسائل کبیسه و خبیسه و ... رو در نظر گرفتن.
از extension method استنفاده بیهوده نکنید ؛ حتی این استفاده من هم بی جا بوده است.
در ضمن فکر میکنم حداقل صحیح ترین راه حل مسئله رو گفتم
دوستان اگر نظری دارند و اشکالی در راه حل من میبینند بگویند.
موفق باشید
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
با سلام آقای linux.
من کدی که گذاشته اید را امتحان کردم. در تبدیل تاریخ میلادی به شمسی یک روز جلوتر را نمایش می دهد. فکر می کنید چرا اینطور است. آیا اگر عددی که در تابع Civil2Persian گذاشته اید بجای 2415021 عددد 2415020 بگذاریم مشکل حل می شود؟
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
نقل قول:
نوشته شده توسط
mnodehi
با سلام آقای linux.
من کدی که گذاشته اید را امتحان کردم. در تبدیل تاریخ میلادی به شمسی یک روز جلوتر را نمایش می دهد. فکر می کنید چرا اینطور است. آیا اگر عددی که در تابع Civil2Persian گذاشته اید بجای 2415021 عددد 2415020 بگذاریم مشکل حل می شود؟
من هم كد را از آقاي linux گرفتم و بدون مشكل در حال كار است
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
سلام
برای تاریخ شمسی میشه دستورات vb رو وارد sql کرد .می دونین که vb 2008 به بالا تقیم شمسی و داخلش داره و راحت تاریخ میلادی و تبدیل میکنه حتی ماههای 30 و31 روزه هم در نظر میگیره
2 ضمیمه
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
با سلام
من اين دو تا تابع را نوشتم
براتون ميگذارم تا شما و بقيه هم استفاده كنيد
فايلها txt هستند ميتوانيد كد موجود را در SQL كپي و اجرا كنيد.
نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟
سلام و صد سلام به دست اندرکاران و کلیه کاربران
در تبدیل تاریخ شمسی به میلادی و بلعکس با مطالعه کمی که در این سایت نمودم تنها تجربه خویش را بازگو می کنم:
بعضی زمانها می بایست در سطح تنها sql این تبدیل صورت گیرد و برخی موارد در خود برنامه موردی ندارد، بطور مثال اگر Procedure در sql نوشته شده باشد و بخاطر عملیات ریاضی که در آن صورت پذیرفته یا به هر دلیلی که باعث تکرار رکوردها و ایجاد اشکال در جواب می نماید تنها می توان تاریخ را در قسمت مثلا where آورد پس کلیه عملیات در سطح sql است گرچه با آمدن linq تا حد زیادی این مشکل برطرف شده اما نه کاملا شایدم من مسلط نیستم ضمنا function های موجود در این سایت نیز صحیح عمل می کنند، لذا با توجه به شرایط راه حل انتخاب می گردد. خود من هم در net. هم در sql این تبدیل را با در نظر گرفتن شرایط موجود انجام می دهم. ضمنا کاربر محترم Kamyar.Kimiyabeigi بسیار ممنون. با تشکر شادمانی