دسته بندی ها
16:13 1398/10/27

کار با تاریخ شمسی وساعت (استفاده از توابع )

مشخصات سوال کننده :
کاربر : Nori     امتیاز کاربر : 72     رتبه کاربر : 15
دسته بندی : WPF Sql Server سی شارپ

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

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

برای کار با تاریخ و ساعت شمسی در SQL Server، استفاده از نوع داده مناسب و توابع مربوطه بسیار اهمیت دارد. اگر تاریخ ها به صورت رشته (nvarchar) ذخیره شده اند، ابتدا باید آنها را به نوع تاریخ تبدیل کنید تا امکان محاسبات بر روی آن ها وجود داشته باشد. در ادامه چند راهکار برای محاسبات مختلف ارایه می شود:

1. اختلاف دو تاریخ:


DECLARE @Date1 NVARCHAR(20) = '1401/01/01';
DECLARE @Date2 NVARCHAR(20) = '1401/02/01';

-- تبدیل رشته به تاریخ
DECLARE @ConvertedDate1 DATETIME = CONVERT(DATETIME, @Date1, 111);
DECLARE @ConvertedDate2 DATETIME = CONVERT(DATETIME, @Date2, 111);

-- محاسبه اختلاف روزها
SELECT DATEDIFF(DAY, @ConvertedDate1, @ConvertedDate2) AS DifferenceInDays;

2. اضافه کردن روز و ساعت به یک تاریخ:


DECLARE @BaseDate NVARCHAR(20) = '1401/01/01';
DECLARE @DaysToAdd INT = 10;
DECLARE @HoursToAdd INT = 5;

DECLARE @ConvertedBaseDate DATETIME = CONVERT(DATETIME, @BaseDate, 111);

-- اضافه کردن روز و ساعت
SELECT DATEADD(HOUR, @HoursToAdd, DATEADD(DAY, @DaysToAdd, @ConvertedBaseDate)) AS NewDate;

3. جمع ساعت ها:


DECLARE @Date1 NVARCHAR(20) = '1401/01/01 10:00:00';
DECLARE @Date2 NVARCHAR(20) = '1401/01/01 05:30:00';

DECLARE @ConvertedDate1 DATETIME = CONVERT(DATETIME, @Date1, 111);
DECLARE @ConvertedDate2 DATETIME = CONVERT(DATETIME, @Date2, 111);

-- جمع ساعت ها
SELECT DATEADD(SECOND, DATEDIFF(SECOND, 0, @ConvertedDate1) + DATEDIFF(SECOND, 0, @ConvertedDate2), 0) AS TotalTime;

با استفاده از توابع `DATEDIFF` و `DATEADD` می توانید به راحتی محاسبات مربوط به تاریخ و زمان را انجام دهید. همچنین پیشنهاد می شود که از نوع داده ها مناسب تری مانند `datetime2` استفاده کنید و اطمینان حاصل کنید که فرمت تاریخ ها در هنگام تبدیل، صحیح باشد.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
هوش مصنوعی

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

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

به عنوان مثال، می توانید از کتابخانه jalaali در زبان برنامه نویسی Python یا دیگر زبان ها استفاده کنید. این کتابخانه ها معمولاً توابعی برای محاسبات مختلف دارند. در اینجا یک مثال برای محاسبه اختلاف دو تاریخ و اضافه کردن روز به یک تاریخ آورده ام:

from datetime import datetime, timedelta
from jalaali import JalaaliDate

# تبدیل تاریخ شمسی به تاریخ میلادی
def jalaali_to_gregorian(j_year, j_month, j_day):
    return JalaaliDate(j_year, j_month, j_day).to_gregorian()

# محاسبه اختلاف دو تاریخ
def date_difference(j_date1, j_date2):
    g_date1 = jalaali_to_gregorian(*j_date1)
    g_date2 = jalaali_to_gregorian(*j_date2)
    delta = g_date2 - g_date1
    return delta.days

# اضافه کردن روز به تاریخ
def add_days(j_date, days):
    g_date = jalaali_to_gregorian(*j_date)
    new_date = g_date + timedelta(days=days)
    return JalaaliDate(new_date.year, new_date.month, new_date.day)

# مثال
date1 = (1401, 5, 10)  # تاریخ شمسی
date2 = (1401, 6, 10)  # تاریخ شمسی

difference = date_difference(date1, date2)
new_date = add_days(date1, 5)

print(f"اختلاف دو تاریخ: {difference} روز")
print(f"تاریخ جدید با اضافه کردن 5 روز: {new_date}")

این مثال ها نشان می دهد که چگونه می توانید از توابع برای محاسبه اختلاف تاریخ ها و افزودن روز به یک تاریخ خاص استفاده کنید. همچنین می توانید توابع مشابهی برای جمع ساعت ها و انجام محاسبات دیگر ایجاد کنید.

توجه داشته باشید که اگر بخواهید عملیات بیشتری انجام دهید، کتابخانه های مختلفی در دسترس است که می توانند به شما کمک کنند.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 17:21 1398/10/28

روشی که شما استفاده کردید هم روش بدی نیست. ولی مشکلی که داره  این هست که بسیاری از امکانات DateTime مثل توابع DateTime.Add یا DateTime.Diff رو نداره.

میتونید یک ستون دیگه هم از نوع datetime اضافه کنید و برای نمایش تاریخ از ستون string استفاده کنید و اگر احیانا در قسمتی از پروژه نیاز داشتید که دو تابع رو مقایسه کنید از فیلد datetime استفاده کنید.

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

تابع تبدیل تاریخ میلادی به شمسی

 

        public static string DateShamsi()
        {
            var currentDate = DateTime.Now;
            PersianCalendar pcCalender = new PersianCalendar();
            int year = pcCalender.GetYear(currentDate);
            int month = pcCalender.GetMonth(currentDate);
            int day = pcCalender.GetDayOfMonth(currentDate);


            string shamsiDate = string.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(year + "/" + month + "/" + day));
            return shamsiDate;
        }

 

ویرایش شده در دوشنبه 17 مرداد 1401 ساعت 22:20:32
به این پاسخ امتیاز بدهید    ‎−1
امتیاز: 1635 رتبه: 2
پاسخ دهنده : Reza0098 22:44 1398/11/19

بهترین روش ذخیره همون DateTime2 هست که مقایسه رو به شدت آسون میکنه و کار باهاش خیلی راحت میشه

فقط توجه کن موقع ذخیره باید میلادی ذخیره بشه و موقع دریافت هم باید با توابع به شمسی تبدیلش کنی .

و توجه کن که تاریخ سیستم هم باید میلادی باشه.

من خودم قبلا از string استفاده میکردم و اصلا خوب نبود ولی با این روش کلی کارم راحت تر شده

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

[Column(TypeName = "datetime2")]
public Nullable<DateTime> dateTime { get; set; }

 

ویرایش شده در دوشنبه 17 مرداد 1401 ساعت 22:19:17
به این پاسخ امتیاز بدهید    ‎−1
امتیاز: 13 رتبه: 55
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود