【发布时间】:2012-02-23 22:29:48
【问题描述】:
在 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 -> 安全 -> 登录 -> {用户属性} -> 并更改用户的默认语言。有了这个解决方案,我进入了 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(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。我尝试了所有方法(全部在 cmets 中等等)。就是找不到解决办法。
【问题讨论】:
-
16 不能是 MM,默认情况下,当您将鼠标悬停时,将调用该方法的任何变量
.ToString(),在您的情况下为DateTime,具体取决于您的机器设置它显示在MM.dd.yyyy中。odr[1]的数据类型是什么? -
odr[1] 是对象,excel 字段中的值是 {16.10.2011 0:00:00} 是日期
dd.MM.yyyy -
其次,您不必担心它在 SQL 中的显示方式,当您检索它时,它的日期将与您存储的日期相同。之后,您可以致电
.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)以dd.MM.yyyy格式获取日期,但这将是string而不是DateTime -
这就是问题所在:在 SQL Server 中显示。 SQL Server 认为我插入 16 作为一个月和 10 作为一天。因此,当我以其他形式按天搜索时,当 date_of_hours 超过 12.10.2011(13.10.2011 - 出现错误)时出现错误。
-
在这种情况下,您可能在该表单中编写了不正确的查询,您能否发布相同的代码。