سلام
ممنون میشم راهنماییم کنید.
سلام
ممنون میشم راهنماییم کنید.
خب چرا شمسیش رو درج نمی کنی؟
من الگوريتمش رو توي سي شارپ مينويسم زحمت تبديل تابهش رو توي اس كيو ال خودت بكش:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//********* Test ************
MessageBox.Show(Shamsi(2005, 8, 14).ToShortDateString());
MessageBox.Show(todayShamsi().ToShortDateString()) ;
}
private DateTime todayShamsi()
{
DateTime today;
today = DateTime.Today;
string year = today.Year.ToString();
string month = today.Month.ToString();
string day = today.Day.ToString();
int Y = int.Parse(year);
int M = int.Parse(month);
int D = int.Parse(day);
return Shamsi(Y, M, D);
}
private DateTime Shamsi(int Y, int M, int D)
{
if (Y == 0)
Y = 2000;
if (Y < 100)
Y = Y + 1900;
if (Y == 2000)
{
if (M > 2)
{
DateTime Temp = new DateTime(Y, M, D);
Temp = Temp.AddDays(1);
Y = int.Parse(Temp.Year.ToString());
M = int.Parse(Temp.Month.ToString());
D = int.Parse(Temp.Day.ToString());
}
}
if (M < 3 || (M == 3 && D < 21))
Y = Y - 622;
else Y = Y - 621;
switch (M)
{
case 1: if (D < 21)
{
M = 10;
D = D + 10;
}
else
{
M = 11;
D = D - 20;
}
break;
case 2: if (D < 20)
{
M = 11;
D = D + 11;
}
else
{
M = 12;
D = D - 19;
}
break;
case 3:
if (D < 21)
{
M = 12;
D = D + 9;
}
else
{
M = 1;
D = D - 20;
}
break;
case 4:
if (D < 21)
{
M = 1;
D = D + 11;
}
else
{
M = 2; D = D - 20;
}
break;
case 5:
if (D < 22)
{
M = M - 3;
D = D + 10;
}
else
{
M = M - 2;
D = D - 21;
}
break;
case 6:
if (D < 22)
{
M = M - 3;
D = D + 10;
}
else
{
M = M - 2;
D = D - 21;
}
break;
case 7:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;
case 8:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;
case 9:
if (D < 23)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 22;
}
break;
case 10:
if (D < 23)
{
M = 7;
D = D + 8;
}
else
{
M = 8;
D = D - 22;
}
break;
case 11:
if (D < 22)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 21;
}
break;
case 12:
if (D < 22)
{
M = M - 3;
D = D + 9;
}
else
{
M = M - 2;
D = D - 21;
}
break;
}
DateTime Temp1 = new DateTime(Y, M, D);
return Temp1;
}
}
}
اينم لينك دانلود تابع ميلادي به شمسي در SQL
ببخشیدااا، ولی مگه ما خود آزاری داریم که اینجوری بخوایم تبدیل کنیم؟؟؟
خیلی راحت با توابع SQL CLR میشه از تو خود #C این تابع رو با استفاده از PersianDate ساخت و به SQL انتقال داد!!!
آموزشش هم توی سایت هست!
فک کنم من سوالم و واضح مطرح نکردم.
من با تبدبل تاربخ میلادی به شمسی مشکلی ندارم .... فقط چون تاریخ و به صورت میلادی تو فیلد dataetime ذخیره کردم تو datagridview به صورت میلادی نمایش داده میشه.... حالا میخوام بدونم تو رویداد CellFormaing دیتاگرید چی بنویسم که اون ستون تاریخشش به شمسی تبدیل شه...
اینو میگی؟ :
ضمیمه 91694
این datagridview هست و اونم تاریخ شمسیه ولی از اول شمسی ذخیره شده بوده ، بدون تبدیل!!
کسی نیس که بتونه راهنماییم کنه؟؟؟
من هنوزم نفهمیدم چرا لقمت رو دور دهنت می چرخونی و مستقیم شمسی ذخیره نمی کنی و خودت رو این همه عذاب می ده؟؟؟!!!!!
دوستان کسیییی هست که بدونه چه جوری میشه تاریخی که به صورت میلادی ذخیره شده رو به شمسی تو دیتاگریدویو نمایش داد؟؟؟ تابع تبدیل مییادی به شمسی و نمی خواما.... کدی که باید تو cellformating توشته شه رو میخوام...
لطفا راهنمایی کنید
با سلام خدمت شما دوست عزیز
خوب راحته که شما بیاین تو رویداد CellFormating توسط یه متغیر تاریخ اون سلول از سطرو بگیرید سپس تاریخ و ماه و روزشو جدا و به شمسی برگردونین بعد اینطوری به اون سلول اختصاص بدین
dataGridView1.Rows[e.RowIndex].Cells[2].Value = string.Format("{0}/{1}/{2}", shyear, shmonth, shday);
موفق باشین
بایت بایت
متوجه نشدم که چرا اصرار دارید تاریخ رو به شکل میلادی در دیتابیس ذخیره کنید؟ نوع char(10) چه مشکلی برای تان ایجاد می کند؟ یا چه پردازشی می خواهید انجام دهید که با این نوع امکانش نیست؟
منم یه روزه دارم همینه بهشون میگم ، مگه بقیه چیکار می کنن؟!!
نحوه ی درج کردن اطلاعاتت رو بگو تا برات کد تاریخ شمسی رو بزارم.
راستش خیلی از دوستان برنامه نویس نظرشون اینه که بهتره تاریخ به صورت میلادی ذخیره شه... تو تاپیکای اینجام که سرچ کردم به این نتیجه رسیدم..
و چون من اولین باره که برنامه نویسی میکنم ترجیح دادم از تجربه دیگران استفاده کنم...
نطر شما چیه؟؟؟ یا ذخیره به صورت شمسی و تو فیلد char تو مقایسه ها برای گزارشش گیری دچار مشکل نمیشم؟؟??
با سلام
مشکل استفاده از DateTime در SQL این است که تاریخ های شمسی با 1300 شروع میشوند که در رنج و محدوده ی نوع متغیرهای DateTime نیست. و از سال 1700 شروع میشود .
در نسخه ی 2008 شما با انتخاب نوع متغیر DateTime2 می توانید به راحتی تاریخ های شمسی رو هم درون دیتابیس ذخیره کنید و این خیلی بهتر از حالت Char است.
محدوده ی Datetime2 :
0001-01-01 through 9999-12-31
January 1,1 AD through December 31, 9999 AD
با این روش دیگه نیاز نیست تاریخ رکوردها رو به صورت میلادی درون دیتابیس ذخیره کنید و بعد هنگام نمایش اونها رو به شمسی تبدیل کنید.
دلیل اینکه توصیه میشه از تاریخ های میلادی استفاده بشه کاملا سلیقه ایه. و بیشتر برمیگرده به اینکه خیلی از برنامه نویس ها ترجیه میدهند از نوع متغیر Datetime بجای Char استفاده کنند.
با توجه به اینکه در دات نت تقویم فارسی هست ( حتی تقویم های چینی ، تایلندی و ... هم هست ) هیچ مشکلی در هیچ زمانی برای تبدیل تاریخ های میلادی به شمسی وجود نداره.
از Globalization استفاده کنید و با PersianCalendar دی 2 خط کد تبدیل رو انجام بدید و میتوانید مطمئن باشید مایکروسافت کارشو درست انجام داده برای دیدن نمونه به اینجا سر بزنید :
http://msdn.microsoft.com/en-us/libr...r.getyear.aspx
پیشنهاد من اینه که شما تاریخ ها رو مستقیما به صورت شمسی به دیتابیس منتقل کنید و بیخیال تبدیل کردن بشید. چون هیچ نیازی برای اینکار وجود نداره و یک روش کاملا استاندارد برای اینکار وجود داره.
دوستان لطفا بگید که اگه تاریخ و به صورت شمسی توchar(10) ذخیره کنم میتونم تو به بازه ی تاریخی یا از 1 ماه خاص یا سال خاص query بگیرم؟؟؟
با سلام خدمت شما
آره میشه میتونی مثلا دستور selecto اینطوری بنویسی :
برای یک ماه خاص :
select * from kala where tsabt='1391/05/03'
برای مابین چند ماه / روز :
select * from kala where tsabt>='1391/01/05' and tsabt<='1391/05/03'
از تکس باکس گرفتن:
select * from kala where tsabt>='" + textBox1.text + "' and tsabt<='" + textBox2.text + "'"
از between هم میتونی استفاده کنی.
موفق باشی
بایت بایت
سلام،
شما میتونید یه حلقه بزارین و در اون تمام فیلد های تاریخ رو به شمسی تبدیل کنید:
using FarsiLibrary.Utils;
using System.Globalization;
if (Dgv.Rows.Count > 0)
for (int i = 0; i < Dgv.Rows.Count; i++)
{
Dgv.Rows[i].Cells["farsiDate"].Value = ((PersianDate)Convert.ToDateTime(Dgv.Rows[i].Cells["GregorianDate"].Value)).ToString("g");
}
farsiDate : سلولیه که تاریخ شمسی توی اون نمایش داده میشه.
GregorianDate : تاریخ میلادی که به صورت مخفی است.
با سلام
دوست من این کار بسیار ساده است
شما باید یک تابع را در گرید فراخوانی کنی
<asp:TemplateField HeaderText="تاریخ خبر" SortExpression="New_Date" Visible="False">
<ItemTemplate>
<div dir="ltr" align="right">
<%# PersianDateTime(Eval("New_Date")) %>
</div>
</ItemTemplate>
حالا این تابع را این طوری در بیهاند بنویس
public static string PersianDateTime(object inputDate)
{
if (inputDate != null)
{
DateTime InputDate = Convert.ToDateTime(inputDate);
return string.Format("{0}", Persia.Calendar.ConvertToPersian(InputDate).Weekda y, PersianTime(InputDate));
}
else
{
return "";
}
}
سلام دوست من . به نظرمن تاریخ را رشته ای تعریف نکن چون بعد به درد سر می افتی
سلام
منم با نظر wgsfahime موافقم. چون خودم توی پروژه ای از نوع تاریخ زمان گذاشتم و وسط کار برای بعضی عملیات به این نتیجه رسیدم که اگر تاریخ و زمان نبود جواب نمیداد.
در ضمن شما اگر بخوای از نوع char(10) بذاری کنترل صحت ورود داده به گردن شماست ، در حالی که توی نوع DateTime به سادگی می تونی با یه خط کد تابع IsDate رو هم پیاده کنی و از معتبر بودن تاریخ هم خیالت راحت بشه.
دلیل دیگه استفاده از تاریخ میلادی برای پیدا کردن اختلاف بین دو تاریخه که در مورد شمسی اصلا جواب نمیده.
چون به عنوان مثال سال میلادی در ماه دوم 28 روزه در حالی که شمسی 31 روزه است و در مورد اختلاف تاریخ به مشکل خواهید خورد.
پس دوستان عزیز خشت اول را با تاریخ میلادی بگذارید تا بعدا به مشکل نخورید .
تبدیلش به شمسی هم کاری نداره . چه توی برنامه ، چه کریستال ریپورت و چه هر جای دیگه از برنامه
موفق باشید.
ببخشید این روشی که دوستمون گفتن استفاده از datetime 2 روش بسیار خوبی است.
طبق عکس زیر چطور میتونم وقتی روی دکمه کلیک شد دو تاریخ از هم کم شه اصلا فکر کنید این دو تاریخ توی یک دو تا textbox هست چجور باید از هم کم شن. اون کدهایی که آقای حبیبی توی صفحه اول قرار دادن خیلی مشکل بود ، یه روش میخوام مثل کد زیر.
DateTime myDateTime = DateTime.Parse("01/11/1390 23:10:30");
TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);
DateTime myDateTime8 = myDateTime - myTimeSpan;
Console.WriteLine("myDateTime - myTimeSpan = " + myDateTime8);
Console.ReadKey();
با تشکر
سلام
آقای samadblaj میشه توی این روشی که شما استفاده می کنی مقدار تاریخ " 1391/02/31 " رو وارد کنید و ببینید که جواب میده یا نه ؟
اگر مشکلی نداشت و از طرفی تونستید اختلاف بین دو تاریخ رو توی روش خودتون با یک خط کد بنویسید حتما به من هم بگید .
گرچه جواب رو از همین الان میدونم که جواب چیه !!!
اختلاف تاریخ که اصلا جواب درستی نخواهد داد .
خودتون رو برای برخورد با مشکلات مختلف روشتون آماده کنید !!!!
موفق باشید
سلام رولی جان این روشی که من استفاده کردم از datetime2 استفاده کردم که راحت جواب داد و فرمت رو پذیرفت عکسی رو که مشاهده میکنید هیچ converti نشده و توسط کاربر به صورت شمسی توی فیلد جدول ذخیره شد و به سادگی هم نمایش داد.سلام
آقای samadblaj میشه توی این روشی که شما استفاده می کنی مقدار تاریخ " 1391/02/31 " رو وارد کنید و ببینید که جواب میده یا نه ؟
اگر مشکلی نداشت و از طرفی تونستید اختلاف بین دو تاریخ رو توی روش خودتون با یک خط کد بنویسید حتما به من هم بگید .
گرچه جواب رو از همین الان میدونم که جواب چیه !!!
اختلاف تاریخ که اصلا جواب درستی نخواهد داد .
خودتون رو برای برخورد با مشکلات مختلف روشتون آماده کنید !!!!
موفق باشید
DateTime myDateTime = DateTime.Parse("01/11/1390 23:10:30");
TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);
DateTime myDateTime8 = myDateTime - myTimeSpan;
Console.WriteLine("myDateTime - myTimeSpan = " + myDateTime8);
Console.ReadKey();
این کد هم جواب میده روی فرمت یعنی اختلاف رو از این نوع فرمت بدست اورد.
پس مشکلی با مقایسه ها نداره.
فقط تنها مشکلی که دارم میخوام جای خط پایین یه تاریخ وارد کنم و بهم اختلاف رو نمایش بده ولی timespan اختلاف رو بر حسب ساعت نمایش میده (که دردسر داره یه روز رو تبدیل کنیم.)
TimeSpan myTimeSpan = new TimeSpan(0, 1, 2, 4);
این نوع تاریخ خیلی مناسب و کارامده . شما مشکلتون چیه وقتی راحت میشه ذخیره کرد راحت توسط TimeSpan اختلاف رو بدست آورد پس مشکل کجاست؟
توابع تاریخ
https://barnamenevis.org/showthread.p...=1#post1591589
این متودها فقط با تاریخ شمسی کار میکنن و برای دیتابیس هایی هستن که تاریخ شمسی رو ذخیره میکنن.
سرعت این روش فوق العاده بیشتر از ذخیره کردن ه تاریخ ه میلادی و تبدیل به شمسیه
EDIT:
روش سریعتر استفاده از یک smallint هست با دقت بالا و 127 سال اعتبار که فکر نکنم کسی اینجا بهش علاقه داشته باشه
struct SmallDate {
short Value;
int GetDay() { return Value & 0x31; }
int GetMonth() { return (Value >> 5) & 0x15; }
int GetYear() { return Value >> 9; }
}
آخرین ویرایش به وسیله FastCode : سه شنبه 21 شهریور 1391 در 18:31 عصر
اولا من وب رو نگفتم ، چون اصلا زمینه ی کارم نیست و اطلاعاتی هم ندارم ازش
دوما کجای این چیزی که نوشتی dateTime2 هستش ؟
من که فرقی نمی بینم
از طرفی چیزی که گفتم رو تست کردین ؟
می دونم که اشتباهه
چون تاریخ شمسی در کار نیست ، بلکه فقط سال میلادی رو عقب می کشه
پس روز های ماه های میلادی و سال کبیسه بر حسب میلادی خواهد بود.
تلاش نکن که محصول مایکروسافت رو ایرانی نشون بدی !!!!! بهش نمیاد!!!!!
دوست عزیز شما انگاری اطلاع ندارید.اولا من وب رو نگفتم ، چون اصلا زمینه ی کارم نیست و اطلاعاتی هم ندارم ازش
دوما کجای این چیزی که نوشتی dateTime2 هستش ؟
من که فرقی نمی بینم
از طرفی چیزی که گفتم رو تست کردین ؟
می دونم که اشتباهه
چون تاریخ شمسی در کار نیست ، بلکه فقط سال میلادی رو عقب می کشه
پس روز های ماه های میلادی و سال کبیسه بر حسب میلادی خواهد بود.
تلاش نکن که محصول مایکروسافت رو ایرانی نشون بدی !!!!! بهش نمیاد!!!!!
ببینید تاریخ datetime سری اول اگه اشتب نکنم از 1700 شروع میشد که ما نیاز به حدود 1200 داریم اگر ضرفیت datetime سری اول پایین بود همه ی ما ازش استفاده میکریم و نیازی نبود که از nvarchar و از این قبیل استفاده کنیم. و نکته دوم این تاریخ رو عقب نمیکشه !!! شما وقتی برای برنامه تون میزارید فاکتور سال 1390 رو میخوام این گزارش فقط فقط با تاریخ برنامه شما ست میشه نا با تاریخ سیستم.
من از nvarchar استفاده کردم اما این نوع تاریخ عالیه. و در بدترین حالت هم هیچ مشکلی برای شما وجود نمیاد (مثل bigint نسبت به int).
و نکته آخر مایکرو سافت و ایرانی ! نه عزیزم فقط زبان ما فارسی نیست این برای کشور های دیگه خاورمیانه از قبیل تاجیکستان ، افغانستان و فکر کنم پاکستان هم هست برای ایناست. و اگر نه اگه فقط زبان ما پارسی بود خبری هم از PersianCalender نبود.
موفق باشید
خوب روش تعریف این متغیر چه شکلیه ؟
و توی کدوم نسخه از ویژوال استودیو وجود داره ؟