Comment insérer une valeur datetime dans une table de base de données SQL où le type de colonne est datetime?
Ce qui suit devrait fonctionner et correspond à ma recommandation (requête paramétrée):
DateTime dateTimeVariable = //some DateTime value, e.g. DateTime.Now;
SqlCommand cmd = new SqlCommand("INSERT INTO <table> (<column>) VALUES (@value)", connection);
cmd.Parameters.AddWithValue("@value", dateTimeVariable);
cmd.ExecuteNonQuery();
DateTime time = DateTime.Now; // Use current time
string format = "yyyy-MM-dd HH:mm:ss"; // modify the format depending upon input required in the column in database
string insert = @" insert into Table(DateTime Column) values ('" + time.ToString(format) + "')";
et exécutez la requête . DateTime.Now
est d'insérer la date et l'heure actuelle ..
Il est plus courant d'utiliser le format aaaa-mm-jj hh: mm: ss (IE: 2009-06-23 19:30:20)
Avec cela, vous n’aurez plus à vous soucier du format de la date (MM/JJ/AAAA ou JJ/MM/AAAA). Cela fonctionnera avec tous.
using (SqlConnection conn = new SqlConnection())
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO <table> (<date_column>) VALUES ('2010-01-01 12:00')";
cmd.ExecuteNonQuery();
}
Cela fait longtemps que je n'ai pas écrit ce genre de choses, alors ce n'est peut-être pas parfait. mais l'idée générale est là.
AVERTISSEMENT: ceci n'est pas assaini. Vous devez utiliser des paramètres pour éviter les attaques par injection.
EDIT: Depuis Jon insiste.
C'est une question plus ancienne avec une réponse appropriée ( veuillez utiliser des requêtes paramétrées ) que je souhaiterais développer avec une discussion sur le fuseau horaire. Pour mon projet actuel, je voulais savoir comment les colonnes datetime
gèrent les fuseaux horaires et cette question est celle que j'ai trouvée.
Il s'avère qu'ils ne le font pas du tout.
La colonne datetime
stocke la DateTime
donnée telle quelle, sans conversion. Peu importe que la date/heure donnée soit UTC ou locale.
Vous pouvez voir par vous-même:
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM (VALUES (@a, @b, @c)) example(a, b, c);";
var local = DateTime.Now;
var utc = local.ToUniversalTime();
command.Parameters.AddWithValue("@a", utc);
command.Parameters.AddWithValue("@b", local);
command.Parameters.AddWithValue("@c", utc.ToLocalTime());
using (var reader = command.ExecuteReader())
{
reader.Read();
var localRendered = local.ToString("o");
Console.WriteLine($"a = {utc.ToString("o").PadRight(localRendered.Length, ' ')} read = {reader.GetDateTime(0):o}, {reader.GetDateTime(0).Kind}");
Console.WriteLine($"b = {local:o} read = {reader.GetDateTime(1):o}, {reader.GetDateTime(1).Kind}");
Console.WriteLine($"{"".PadRight(localRendered.Length + 4, ' ')} read = {reader.GetDateTime(2):o}, {reader.GetDateTime(2).Kind}");
}
}
}
Ce que cela va imprimer dépendra bien sûr de votre fuseau horaire mais plus important encore, les valeurs lues auront toutes Kind = Unspecified
. Les première et deuxième lignes de sortie seront différentes en fonction du décalage de votre fuseau horaire. Les deuxième et troisième seront les mêmes. L'utilisation de la chaîne de format "o" (aller-retour) n'affiche aucun spécificateur de fuseau horaire pour les valeurs lues.
Exemple de sortie de GMT + 02: 00:
a = 2018-11-20T10:17:56.8710881Z read = 2018-11-20T10:17:56.8700000, Unspecified
b = 2018-11-20T12:17:56.8710881+02:00 read = 2018-11-20T12:17:56.8700000, Unspecified
read = 2018-11-20T12:17:56.8700000, Unspecified
Notez également comment les données sont tronquées (ou arrondies) à ce qui semble être 10 ms.