PDA

View Full Version : درج تاریخ فارسی در sql



prince-of-persia
سه شنبه 29 مرداد 1387, 23:36 عصر
سلام
وقتی می خوام این دستور sql رو اجرا کنم


INSERT INTO LastResTime
(uid, LastResTime)
VALUES ('Kazemi', ' 2008/08/19 11:27:33 ب.ظ')

خطا میده و فهمیدم به خاطر ب.ظ هست و وقتی برش میرام و به جاش pm میگزارم درست میشه
چطوری این مشکل رو حل کنم ؟
یا چطور کاری کنم که datetime.now() در خروجی amوpm بده ؟

با تشکر

mehrpars
چهارشنبه 30 مرداد 1387, 00:24 صبح
فیلدت از جنس date هست یا string

mdssoft
چهارشنبه 30 مرداد 1387, 01:06 صبح
من تو PHP همیشه زمان رو بر حسب تعداد ثانی های سپری شده از یه زمان خاص تو دیتا بیس ( که از نوع int ) است ذخیره می کردم و هنگام نمایش اون رو به تاریخ شمسی تبدیل می کردم.
تو C# هم ، دنبال چنین چیزی می گشتم ، اما خوب اون طور که من می خواستم نتونستم پیدا کنم .
برای همین این DLL (http://www.codeproject.com/KB/cs/PersianCalendar.aspx) رو ساختم که مشکلم رو حل کرد .

prince-of-persia
چهارشنبه 30 مرداد 1387, 13:55 عصر
datetime هست

linux
چهارشنبه 30 مرداد 1387, 15:45 عصر
datetime هست
cast یادت رفته.

اَرژنگ
چهارشنبه 30 مرداد 1387, 16:02 عصر
من تو PHP همیشه زمان رو بر حسب تعداد ثانی های سپری شده از یه زمان خاص تو دیتا بیس ( که از نوع int ) است ذخیره می کردم و هنگام نمایش اون رو به تاریخ شمسی تبدیل می کردم.
تو C# هم ، دنبال چنین چیزی می گشتم ، اما خوب اون طور که من می خواستم نتونستم پیدا کنم .
برای همین این DLL (http://www.codeproject.com/KB/cs/PersianCalendar.aspx) رو ساختم که مشکلم رو حل کرد .
چرا دی‌ال‌ال ؟ مگر در دات‌نت از اسمبلی استفاده نمیکنیم؟ سورسش را از کجا میشه بدست آورد؟
در ضمن در همان صفحه یکی از پستها مشکلات را گفته:

Xaroth wrote:
also, making it an uint assumes that there is nothing prior to 1-1-1970, while there is...

معنیش این است که برایه سالها قبل ۱۹۷۰ کار نمیکند.

اَرژنگ
چهارشنبه 30 مرداد 1387, 16:10 عصر
cast یادت رفته.
چجور cast استفاده میشه در این مورد؟

prince-of-persia
چهارشنبه 30 مرداد 1387, 17:28 عصر
دوستان فکر نکنم این مشکل اینقدر ها حاد باشه.

فکر کنم یک ربطایی به globalization داشته باشه.
چون من ایران رو موقع نصب ویندوز انتخاب کردم اینطوری میده حالا باید چه کرد که am و pm بده

linux
چهارشنبه 30 مرداد 1387, 19:57 عصر
چجور cast استفاده میشه در این مورد؟

حالا cast یا convert که کانورت بهتر هست.

اولا همچین فرمتی در sql شناخته شده نیست.
2008/08/19 11:27:33 ب.ظ
باید تبدیل بشه به
CONVERT(DATETIME, '2008-11-28 14:15:34', 102)

linux
چهارشنبه 30 مرداد 1387, 20:02 عصر
دوستان فکر نکنم این مشکل اینقدر ها حاد باشه.

فکر کنم یک ربطایی به globalization داشته باشه.
چون من ایران رو موقع نصب ویندوز انتخاب کردم اینطوری میده حالا باید چه کرد که am و pm بده
ببین باید از تابع cast یا convert استفاده کنی یا از پارامترها


SqlCommand cmd = new SqlCommand();
cmd.CommandText = "INSERT INTO dbo.TestCustomer " +
" (uid, LastResTime)" +
"VALUES (@uid, @LastResTime)";
SqlParameter p1 = new SqlParameter();
SqlParameter p2 = new SqlParameter();
p1.DbType = DbType.String;
p1.ParameterName = "@uid";
p1.Value = "Test";
p2.DbType = DbType.DateTime;
p2.ParameterName = "@LastResTime";
p2.Value = DateTime.Now;
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Connection = new SqlConnection("Your Connection String Here");
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();

prince-of-persia
چهارشنبه 30 مرداد 1387, 21:59 عصر
برنامه من از 3 لایه تشکیل شدن یعنی :
اول:

LastResTimeClass LRC = new LastResTimeClass();
LRC.Add(id,DateTime.Now);

دوم :

public void Add(string uid, DateTime LastResTime)
{
string Sql = "insert into LastResTime (uid,LastResTime) values ('{0}',{1})";
Sql = string.Format(Sql,uid, LastResTime);
db.Connect();
db.DoCommand(Sql);
db.Disconnect();
}

سوم:

public void DoCommand(string sql)
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}

این یعنی من باید یک رشته رو به لایه های پایین تر بفرستم حالا این مشکلو چطور حل کنم ؟
البته ایده پارامتر ها فکر کنم صحیح ترین راه است اما من این مشکل رو دارم که امیدوارم با کمک شما حل بشه .

ممکنه اون convert رو یکم کامل تر توضیح بدبد ؟

با تشکر

linux
چهارشنبه 30 مرداد 1387, 22:24 عصر
برنامه من از 3 لایه تشکیل شدن یعنی :
اول:

LastResTimeClass LRC = new LastResTimeClass();
LRC.Add(id,DateTime.Now);

دوم :

public void Add(string uid, DateTime LastResTime)
{
string Sql = "insert into LastResTime (uid,LastResTime) values ('{0}',{1})";
Sql = string.Format(Sql,uid, LastResTime);
db.Connect();
db.DoCommand(Sql);
db.Disconnect();
}

سوم:

public void DoCommand(string sql)
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}

این یعنی من باید یک رشته رو به لایه های پایین تر بفرستم حالا این مشکلو چطور حل کنم ؟
البته ایده پارامتر ها فکر کنم صحیح ترین راه است اما من این مشکل رو دارم که امیدوارم با کمک شما حل بشه .

ممکنه اون convert رو یکم کامل تر توضیح بدبد ؟

با تشکر
احتیاجی نیست پارامتر به مرحله 2 بفرستی در مرحله 2 از روشی که گفتم استفاده کن

prince-of-persia
چهارشنبه 30 مرداد 1387, 22:39 عصر
میتونم اما این کار نظم برنامه رو بهم میرزه
چطور باید به رشته تبدیلش کنم و به لایه های پایین تر بفرستمش ؟

linux
چهارشنبه 30 مرداد 1387, 22:53 عصر
میتونم اما این کار نظم برنامه رو بهم میرزه
چطور باید به رشته تبدیلش کنم و به لایه های پایین تر بفرستمش ؟

public void Add(string uid, DateTime LastResTime)
{
string Sql = "insert into LastResTime (uid,LastResTime) values (@uid,@LastResTime)";
//
SqlParameter p1 = new SqlParameter();
SqlParameter p2 = new SqlParameter();
p1.DbType = DbType.String;
p1.ParameterName = "@uid";
p1.Value = uid;
p2.DbType = DbType.DateTime;
p2.ParameterName = "@LastResTime";
p2.Value = LastResTime;
///
List<SqlParameter> pList = new List<SqlParameter>();
pList.Add(p1);
pList.Add(p2);
db.Connect();
db.DoCommand(Sql,pList );
db.Disconnect();
}

public void DoCommand(string sql,List<SqlParameter> parameters)
{

cmd.CommandText = sql;
if (parameters != null)
{
foreach (SqlParameter p in parameters)
{
cmd.Parameters.Add(p);
}
}
cmd.ExecuteNonQuery();
}

programmable
چهارشنبه 30 مرداد 1387, 22:56 عصر
اساتید فکر نمی کنید این مشکل با یه تکه کد کوچک در فابل Program.cs حل بشه؟ :



Application.CurrentCulture= new System.Globalization.CultureInfo("fa-IR");
Application.CurrentCulture.DateTimeFormat.PMDesign ator = "PM";
Application.CurrentCulture.DateTimeFormat.AMDesign ator = "AM";

mahsa heydari
پنج شنبه 31 مرداد 1387, 00:24 صبح
سلام
بهتره توی پایگاه داده تاریخ از نوع string باشه بعد برای نمایش،اونو تبدیل به تاریخ شمسی کنید

yasercomeng
پنج شنبه 31 مرداد 1387, 02:41 صبح
اصلاً چه نيازي به اين كاراست؟
چرا مي خواين ب.ظ رو تويه پايگاه ذخيره كنيد؟
به نظر خيلي راحتتريد تا تاريخ رو به فرم ٢٤ ساعته ي اون ذخيره كنيد.
اين تيكه كد كه از MSDN هست شايد كمكتون كنه.

DateTime july28 = new DateTime(1979, 7, 28, 5, 23, 15, 16);

string[] july28Formats = july28.GetDateTimeFormats();

// Print out july28 in all DateTime formats using the
// default culture.
foreach (string format in july28Formats) {
System.Console.WriteLine(format);
}

IFormatProvider culture =
new System.Globalization.CultureInfo("fr-FR", true);
// Get the short date formats using the "fr-FR" culture.
string [] frenchJuly28Formats =
july28.GetDateTimeFormats('d', culture);

// Print out july28 in various formats using "fr-FR" culture.
System.Console.WriteLine("Starting fr-FR formats");
foreach (string format in frenchJuly28Formats) {
System.Console.WriteLine(format);
}

متد GetDateTimeFormats يه مدل overload شده داره كه يه كاركتر مي گيره، كاراكتر g رو بهش بدي تمام نتايجي رو كه بخواي بهت مي ده.موفق باشي