在excel表格中,我的日期格式为dd.MM.yyyy
16.10.2011 (16为dd,10为MM)。当我从excel导入数据到SQL Server 2008时,我得到MM.dd.yyyy
但仍然是16.10.2011 (16为MM,10为dd)。那不对。我找到了解决方案:转到SQL Server 2008 - >安全 - >登录 - > {user properties} - >并更改用户的默认语言。使用此解决方案,我将进入SQL Server 2008 dd.MM.yyyy
16.10.2011 (16作为dd,10作为MM)。有没有其他方法可以在不更改用户语言的情况下以dd.MM.yyyy
格式转换日期?
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\JantarV7Export.xlsx;Extended Properties=Excel 8.0";
OleDbConnection olecon = new OleDbConnection(sConnectionString);
olecon.Open();
OleDbCommand cmd = olecon.CreateCommand();
cmd.CommandText = "SELECT person_id, date_of_hours, number_of_hours FROM [Sheet1$]";
OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
OleDbDataReader odr = cmd.ExecuteReader();
conn.Open();
while (odr.Read())
{
SqlCommand cmd1 = conn.CreateCommand();
cmd1.CommandText = "INSERT INTO test_data values (newid(),'" + odr[0] + "',@date_of_hours,'" + odr[2] + "')";
cmd1.Parameters.Add("@date_of_hours", SqlDbType.DateTime).Value =odr[1];
}
cmd1.ExecuteNonQuery();
olecon.Close();
conn.Close();
我认为问题出在我插入test_data
数据表的时候。所以我可能应该在插入之前以某种方式转换日期。你有什么建议?谢谢。有没有这样的选择:
cmd1.CommandText = "INSERT INTO test_data values (newid(),'" + odr[0] +
"',CONVERT(VARCHAR(20),@date_of_hours,104),'" + odr[2] + "')";
cmd1.Parameters.Add("@date_of_hours", SqlDbType.DateTime).Value =odr[1];
(由于插入中的CONVERT,这是行不通的,但有一些类似的解决方案)或
CONVERT(VARCHAR(20),@date_of_hours,104) AS [DD:MM:YYYY]
更新 在其他形式中,我通过组合框读取数据。它显示1.10.2011,2.10.2011,....至16.10.2011。
da_test_data = new SqlDataAdapter("SELECT test_data_id, date_of_hours, number_of_hours FROM test_data WHERE _person_id= '" + person_id_person + "' ORDER BY date_of_hours", conn);
dt_test_data = new DataTable();
da_test_data.Fill(dt_test_data);
cb_datum.DataSource = dt_test_data.DefaultView;
cb_datum.ValueMember = "test_data_id";
cb_datum.DisplayMember = "date_of_hours";
用于项目的组合框:
private void cb_datum_SelectedIndexChanged(object sender, EventArgs e)
{
DataRowView drvProjekt = cb_datum.SelectedItem as DataRowView;
if (drvProjekt != null)
{
string date1 = drvProjekt["date_of_hours"].ToString();
DateTime date2 = new DateTime();
date2 =Convert.ToDateTime(date1);
//DateTime date = DateTime.ParseExact(date1, "MMddyyyy hh:mm:ss", null);
//DateTime date = DateTime.ParseExact(date1, "dd.MM.yyyy", System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat);
//object obj = DateTime.ParseExact(dddd, "MM/dd/yyyy hh:mm", null);
conn = new SqlConnection(connectionString);
conn.Open();
da_projekt = new SqlDataAdapter("SELECT projekt_id, name_of_projekt, date_of_start, date_of_end FROM projekt WHERE date_of_start < '" + date2 + "' AND date_of_end > '" + date2 + "' ", conn);
dt_projekt = new DataTable();
da_projekt.Fill(dt_projekt);
cb_projekt_id.DataSource = dt_projekt.DefaultView;
cb_projekt_id.ValueMember = "projekt_id";
cb_projekt_id.DisplayMember = "name_of_projekt";
conn.Close();
}
}
当我选择13.10.2011时,我收到错误。日期被识别为MM.dd.yyyy。我尝试了一切(所有评论和更多)。 Yust找不到解决方案。
答案 0 :(得分:4)
正如我在评论中提到的那样。您的日期值在SQL中存储为Date
。因此,当您在SQL中存储日期时,它将仅保留日期,当您检索它时,您将直接获得日期对象。在SQL中,它可能显示为MM.dd.yyyy
并不重要。
当您从SQL中读取此数据时,您将获得DateTime
对象,如果您执行.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)
,您将获得dd.MM.yyyy
格式。您可以在DateTime
对象上使用任何格式,在MSDN上阅读更多相关内容。
希望这能回答你的问题。
答案 1 :(得分:3)
如果可能,只需替换“。”在excel文件中使用“/”并将单元格格式化为dd / mmm / yyyy
答案 2 :(得分:3)
Excel本身将日期保留为自某个日期以来的日期,我不记得它是浮点值。重要的是,这匹配DateTime.ToOADate()。
我们从excel文件中读取日期作为浮点值,然后使用DateTime.ToOADate()。
答案 3 :(得分:3)
您以错误的方式使用CONVERT
。在数据库端,您将日期时间转换为字符串(varchar),然后您必须依赖内置类型转换来再次获取日期时间。你应该反过来做。如果在c#中将datetime转换为具有指定格式的字符串,并将其转换为具有匹配样式的数据库端的日期时间,则不会出错。
当您使用CONVERT
时,日期部分应与您使用的样式匹配(在您的情况下为104)。在你的sql中使用它:
CONVERT(DATETIME, @date_of_hours, 104)
和
cmd1.Parameters.Add("@date_of_hours", SqlDbType.NVarChar).Value =
string.Format("{0:dd.MM.yyyy}", odr[1])