دسته بندی ها
21:35 1398/09/14

مقایسه بین دو تاریخ شمسی ذخیره شده با فیلد varchar در سی شارپ

مشخصات سوال کننده :
کاربر : mobile_app     امتیاز کاربر : 18     رتبه کاربر : 40
دسته بندی : سی شارپ

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 9213
هوش مصنوعی

پاسخ هوش مصنوعی

برای مقایسه دو تاریخ شمسی که به صورت رشته ای ذخیره شده اند، می توانید از کتابخانه PersianCalendar در زبان سی شارپ استفاده کنید. ابتدا باید این رشته ها را به نوع تاریخ تبدیل کنید و سپس مقایسه انجام دهید. در زیر یک مثال ساده آورده شده است:

using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string dateStr1 = "1402/01/01"; // تاریخ اول
        string dateStr2 = "1402/02/01"; // تاریخ دوم

        PersianCalendar pc = new PersianCalendar();

        // تجزیه تاریخ به روز، ماه و سال
        var parts1 = dateStr1.Split('/');
        var parts2 = dateStr2.Split('/');
        
        int year1 = int.Parse(parts1[0]);
        int month1 = int.Parse(parts1[1]);
        int day1 = int.Parse(parts1[2]);
        
        int year2 = int.Parse(parts2[0]);
        int month2 = int.Parse(parts2[1]);
        int day2 = int.Parse(parts2[2]);

        // تبدیل تاریخ به DateTime برای مقایسه
        DateTime dt1 = new DateTime(year1, month1, day1, pc);
        DateTime dt2 = new DateTime(year2, month2, day2, pc);

        // مقایسه تاریخ ها
        if (dt1 > dt2)
        {
            Console.WriteLine($"{dateStr1} بزرگتر از {dateStr2} است.");
        }
        else if (dt1 < dt2)
        {
            Console.WriteLine($"{dateStr1} کوچکتر از {dateStr2} است.");
        }
        else
        {
            Console.WriteLine($"{dateStr1} برابر با {dateStr2} است.");
        }
    }
}

در این مثال، دو تاریخ شمسی به رشته تبدیل شده و سپس به نوع DateTime تبدیل می شوند تا بتوان آن ها را مقایسه کرد. با استفاده از عملگرهای مقایسه ای، می توانید تشخیص دهید که کدام تاریخ بزرگتر، کوچکتر یا برابر است.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : mohammad-i 11:37 1398/09/15
select * from Table where (date > '1398/09/10' )

به جای تاریخ استاتیک که من گذاشتم، میتونید متغییر یا کنترلر خودتون رو قرار بدید.

به این پاسخ امتیاز بدهید    1
امتیاز: 260 رتبه: 7
پاسخ دهنده : mohammad-i 11:44 1398/09/15

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

از کد زیر برای مقایسه دو تاریخ از نوع استرینگ میتونید استفاده کنید:

select * from Table where (date BETWEEN @StartDate AND @EndDate)

 

به این پاسخ امتیاز بدهید    1
امتیاز: 260 رتبه: 7
پاسخ دهنده : Sowgandi 11:47 1398/09/15

سلام. تابع زیر را در بدنه فرم یا پروژه خود قرار دهید.

   public int GetPersianDaysDiffDate(string Date1, string Date2)
        {
            int year1 = Convert.ToInt16(Date1.Substring(0, 4));
            int month1 = Convert.ToInt16(Date1.Substring(5, 2));
            int day1 = Convert.ToInt16(Date1.Substring(8, 2));

            int year2 = Convert.ToInt16(Date2.Substring(0, 4));
            int month2 = Convert.ToInt16(Date2.Substring(5, 2));
            int day2 = Convert.ToInt16(Date2.Substring(8, 2));

            System.Globalization.PersianCalendar calendar = new System.Globalization.PersianCalendar();
            DateTime dt1 = calendar.ToDateTime(year1, month1, day1, 0, 0, 0, 0);
            DateTime dt2 = calendar.ToDateTime(year2, month2, day2, 0, 0, 0, 0);
            TimeSpan ts = dt2.Subtract(dt1);

            return ts.Days;
        }

این تابع دو ورودی Date1 و Date2 دارد. خروجی این تابع از نوع int است و اختلاف روزهای دو تاریخ رو به شما برمیگردونه. حالا اگر این مقدار برابر صفر بود یعنی دو تاریخ با هم برابره، اگه بزرگتر از صفر بود یعنی Date2 بزرگتر از Date1 هست و اگر منفی بود برعکس. از این تابع به شکل زیر استفاده کنید.

string Date1 = "1398/01/01";
string Date2 = "1398/01/05";

int Diff = GetPersianDaysDiffDate(Date1 , Date2);

 

به این پاسخ امتیاز بدهید    3
امتیاز: 876 رتبه: 3
پاسخ دهنده : pedram_khan 15:01 1398/09/15

یه نکته دیگه هم در مورد کار با تاریخ شمسی در سی شارپ وجود داره . سعی کنید تاریخ هاتون رو با فرمت زیر در دیتابیس ذخیره کنید

1398/05/08

اگر این فرمت رو رعایت کنید مطمین خواهید بود که رشته تاریخ شما همیشه 10 کاراکتر هست. اما اگر این فرمت رعایت نشه حالات زیر ممکنه پیش بیاد

1398/5/15

1398/2/3

و البته خیلی حالا دیگه که این باعث میشه رشته شما کمتر از 10 کاراکتر بشه گاهی و مقایسه بین تاریخ ها رو سخت میکنه.

البته من خودم توی پروژه هام همیشه سعی میکنم هم تاریخ شمسی رو به صورت Varchar توی دیتابیس ذخیره کنم و هم تاریخ میلادی رو به صورت DateTime داشته باشم چون برای خیلی عملیات مثل محاسبه اختلاف دو تاریخ در سی شارپ با تاریخ میلادی کار کردن خیلی ساده تر هست.

 

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

 

string.Format("{0:yyyy/MM/dd}", Convert.ToDateTime("1398/5/12"));

 

توی این لینک میتونید در مورد Format در سی شارپ اطلاعات بیشتری رو کسب کنید.

ویرایش شده در جمعه 15 آذر 1398 ساعت 15:06:34
به این پاسخ امتیاز بدهید    1
امتیاز: 277 رتبه: 6
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود