Как конвертировать дату в формате dd.MM.yyyy в C # из Excel - PullRequest
2 голосов
/ 01 февраля 2012

В листе Excel у меня есть дата в формате dd.MM.yyyy 16.10.2011 (16 как дд, 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 как дд, 10 как ММ) . Есть ли другой способ конвертировать дату в 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]

UPDATE В другой форме я читаю данные через выпадающий список. Показывает 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. Я перепробовал все (все в комментариях и многое другое). Ты просто не можешь найти решение.

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Как я уже упоминал в комментарии.Ваше значение даты хранится как Date в SQL.Таким образом, когда вы храните дату в SQL, она останется только датой, а когда вы ее получите, вы получите объект даты напрямую.В SQL это может отображаться как MM.dd.yyyy, это не имеет значения.

Когда вы будете читать эти данные из SQL, вы получите объект DateTime, в этом случае, если вы сделаете .ToString("dd.MM.yyyy", CultureInfo.InvariantCulture), вы получитеполучить в формате dd.MM.yyyy.Вы можете использовать любой формат объекта DateTime, подробнее об этом - MSDN .

Надеюсь, что это ответ на ваш вопрос.

3 голосов
/ 01 февраля 2012

Вы используете CONVERT неправильно. На стороне базы данных вы конвертируете datetime в строку (varchar), а затем вам нужно полагаться на встроенные преобразования типов, чтобы снова получить datetime. Вы должны сделать это наоборот. Если в c # вы конвертируете datetime в строку с указанным форматом и конвертируете ее в 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])
3 голосов
/ 01 февраля 2012

Excel изначально сохраняет даты как дни, так как некоторые даты я не помню в качестве значения с плавающей запятой. Важно то, что это соответствует DateTime.ToOADate ().

Мы читаем даты из файлов Excel как значение с плавающей запятой, а затем используем DateTime.ToOADate ().

3 голосов
/ 01 февраля 2012

Если возможно, просто замените «.»с помощью "/" в файле Excel и отформатируйте ячейку как дд / ммм / гггг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...