Вы должны использовать соответствующий DateTime
тип в вашей схеме. Не используйте строки для представления Date
s или DateTime
s или Time
s, чисел или чего-либо еще, кроме собственной строки.
MySql допускает следующие типы схем:
DATE
TIME
DATETIME
TIMESTAMP
YEAR
В этом случае наиболее подходящим будет DATETIME
. Это соответствует типу .net System.DateTime
. Если вы используете ADO.NET, вы должны использовать параметры в своих запросах. Пример:
using(MySqlCommand m = new MySqlCommand("INSERT INTO table (sendDate) VALUES (@sendDate)"))
{
m.Parameters.Add("@sendDate", MySqlDbType.DateTime).Value = myObj.SendDate;
// rest of code
}
Пакетная вставка
Вам не нужно запускать один оператор вставки за раз. Вы можете легко создать одну инструкцию с несколькими кортежами, которые вы хотите вставить. Вот пример кода C #, который делает это с 1 столбцом. Вы можете легко расширить это с несколькими значениями для кортежа.
var sql = "INSERT INTO table (sendDate) VALUES (";
var parameters = input.Select((queue, i) => new MySqlParameter("@sendDate" + i.ToString(), MySqlDbType.DateTime)).ToArray();
sql += string.Join("), (", parameters.Select(_ => _.ParameterName)) + ")";
for (int i = 0; i < parameters.Length; i++)
{
parameters[i].Value = input[i].SendDate;
}
using(var connection = new MySqlConnection(connectionString))
using(var command = new MySqlCommand(sql, connection))
{
command.Parameters.AddRange(parameters);
connection.Open();
command.ExecuteScalar();
}
Когда конвертировать?
Стек кода всегда должен преобразовывать DateTime
в string
как можно позже вверх по стеку вызовов, как правило, на уровне представления (в тот момент, когда человек должен его прочитать). Обратное также верно, вход string
должен быть преобразован в DateTime
как можно раньше, спускаясь вниз по стеку вызовов (так, опять же, на уровне представления).
Почему бы не varchar для дат?
Если вам интересно почему вам не следует хранить DateTime
как string
, см. Этот предыдущий ответ: Когда использовать VARCHAR и DATE / DATETIME . Я процитирую важные вещи:
Некоторые недостатки версии VARCHAR:
- Вы не можете легко добавлять / вычитать дни к версии VARCHAR.
- Труднее извлечь только месяц / год.
- Ничто не мешает помещать устаревшие данные в столбец VARCHAR в базе данных.
- Версия VARCHAR зависит от культуры.
- Вы не можете легко отсортировать даты.
- Трудно изменить формат, если вы хотите позже.
- Это нетрадиционно, что усложнит понимание другим разработчикам.
- Во многих средах использование VARCHAR будет занимать больше места для хранения. Это может не иметь значения для небольших объемов данных, но в коммерческих средах с миллионами строк данных это вполне может иметь большое значение.
Часовые пояса и значения
Не забывайте о часовых поясах, если это применимо к вашему приложению. Рекомендуется всегда хранить значение DateTime
UTC в базе данных вместо значения местного часового пояса. Затем значение UTC может быть отправлено на уровень представления, где уровень представления отвечает за применение к значению местного часового пояса (необязательно). Некоторые инфраструктуры пользовательского интерфейса имеют встроенные механизмы для этого в элементах управления DateTime
. Опять же, обратное также верно, пусть уровень представления преобразует любой ввод в значение UTC DateTime
и отправляет его обратно в стек вызовов на сервер.