کار با تاریخ شمسی وساعت (استفاده از توابع )
دنبال یه روش کامل و تست شد برای کار با تاریخ و ساعت شمسی هستم
در حال حاضر نوع فیلد های تاریخ رو به صورت nvarchar(20) توو sql ذخیره میکنم
الان میخوام بدونم اگه بخوام روی فیلد های تاریخ محاسبات انجام بدم چیکار کنم
- اختلاف دو تا تاریخ
- اضافه کردن روز و ساعت به یک تاریخ
- جمع ساعت ها و...
قبلا یه جدول ایجاد کرده بودم وتارخ های شمسی و میلادی ذخیره کرده بودم و باهاشون کار میکردم
یه زمانی هم از نوع داده datetime2(7) استفاده کردم که خطا زیاد داشت و بیخیالش شدم
پاسخ هوش مصنوعی
برای کار با تاریخ و ساعت شمسی در 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` استفاده کنید و اطمینان حاصل کنید که فرمت تاریخ ها در هنگام تبدیل، صحیح باشد.
پاسخ هوش مصنوعی
برای کار با تاریخ شمسی و انجام محاسبات مختلف با آن، بهترین روش استفاده از کتابخانه های موجود در زبان برنامه نویسی مورد نظرتان است. در اینجا به برخی از توابع و روش ها برای انجام محاسبات مختلف با تاریخ شمسی اشاره می کنم.
به عنوان مثال، می توانید از کتابخانه 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}")
این مثال ها نشان می دهد که چگونه می توانید از توابع برای محاسبه اختلاف تاریخ ها و افزودن روز به یک تاریخ خاص استفاده کنید. همچنین می توانید توابع مشابهی برای جمع ساعت ها و انجام محاسبات دیگر ایجاد کنید.
توجه داشته باشید که اگر بخواهید عملیات بیشتری انجام دهید، کتابخانه های مختلفی در دسترس است که می توانند به شما کمک کنند.
روشی که شما استفاده کردید هم روش بدی نیست. ولی مشکلی که داره این هست که بسیاری از امکانات 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;
}
بهترین روش ذخیره همون DateTime2 هست که مقایسه رو به شدت آسون میکنه و کار باهاش خیلی راحت میشه
فقط توجه کن موقع ذخیره باید میلادی ذخیره بشه و موقع دریافت هم باید با توابع به شمسی تبدیلش کنی .
و توجه کن که تاریخ سیستم هم باید میلادی باشه.
من خودم قبلا از string استفاده میکردم و اصلا خوب نبود ولی با این روش کلی کارم راحت تر شده
فقط اگه خواستی بصورت کد فرست دیتابیس رو درست کنی باید فیلد های تاریخ رو به صورت زیر تعریف کنی:
[Column(TypeName = "datetime2")]
public Nullable<DateTime> dateTime { get; set; }
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- حذف کامل یک رکورد در جدول ریلیشن شده
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf