【问题标题】:How to Convert date into dd.MM.yyyy format in C# from excel如何从excel将日期转换为C#中的dd.MM.yyyy格式
【发布时间】: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 - 出现错误)时出现错误。
  • 在这种情况下,您可能在该表单中编写了不正确的查询,您能否发布相同的代码。

标签: c# excel date


【解决方案1】:

如果可能,只需替换“。”在excel文件中使用“/”并将单元格格式化为dd/mmm/yyyy

【讨论】:

    【解决方案2】:

    正如我在评论中提到的。您的日期值在 SQL 中存储为Date。因此,当您在 SQL 中存储日期时,它将仅保留日期,当您检索它时,您将直接获取日期对象。在SQL中可能显示为MM.dd.yyyy没关系。

    当你从 SQL 读取这些数据时,你会得到DateTime 对象,如果你这样做.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture),你会得到dd.MM.yyyy 格式。您可以在DateTime 对象上使用任何格式,在MSDN 上阅读更多信息。

    希望这能回答你的问题。

    【讨论】:

    • 我发布了我所有的代码。你有什么建议把.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)放在哪里,因为我仍然认为问题出在INSERT到SQL Server中
    • 看看当你从SQL中读取信息的时候,什么都不做,直接绑定到下拉,但是当你点击cb_datum_SelectedIndexChanged,里面string date1 = drvProjekt["date_of_hours"].ToString(); DateTime date2 = DateTime.ParseExact(date1, "dd.MM.yyyy", CultureInfo.InvariantCulture);
    • 还是没有运气。仍然说:字符串未被识别为有效的日期时间
    • String was not recognized as a valid DateTime,在线DateTime date2 = DateTime.ParseExact(date1, "dd.MM.yyyy", CultureInfo.InvariantCulture);
    • 别担心 SQL 会显示什么,它在内部会正确存储它。
    【解决方案3】:

    Excel 本身将日期保留为自某个日期以来的天数,我不记得它是浮点值。重要的是这匹配 DateTime.ToOADate()。

    我们从 excel 文件中读取日期作为浮点值,然后使用 DateTime.ToOADate()。

    【讨论】:

    • 在您的情况下,它仅插入 10.12.2011 (MM.dd.yyyy) 格式,然后我收到错误 Conversion failed when converting date and/or time from character string
    【解决方案4】:

    你用错了CONVERT。在数据库方面,您将日期时间转换为字符串 (varchar),然后您必须依靠内置类型转换来再次获取日期时间。你应该反过来做。如果在 c# 中将日期时间转换为具有指定格式的字符串,并将其转换为具有匹配样式的数据库端的日期时间,则不会出错。

    当您使用 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])
    

    【讨论】:

    • 它只插入到 10.12.2011 ,然后我得到一个错误Conversion failed when converting date and/or time from character string (10.13.2011)
    • 好的,但现在问题被简化为在您的 odr[1] 列中获取日期时间值。如果excel中的格式是“日期”,我不明白为什么不是这种情况。你用的是什么excel版本? 8.0 建议使用 excel '97,但“xlsx”建议至少使用 Excel 2007 (v. 12)。
    • 我使用 excel 2010,单元格是日期,如果我在 excel 中更改日期格式,它会正确更改(我的意思是日期格式)。是的,我知道它困扰了我 2 天
    • 但是我认为您应该使用其他连接字符串:Provider=Microsoft.ACE.OLEDB.12.0 和 Extended Properties=Excel 12.0。使用它,我总是从格式为“日期”的 excel 列中获取日期时间值(与 excel 中的显示无关)。
    • 您确定工作表中 date_of_hours 列中的 所有 值都具有“日期”格式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2018-03-16
    • 2020-03-04
    相关资源
    最近更新 更多