web-dev-qa-db-fra.com

insérer la valeur datetime dans la base de données SQL avec c #

Comment insérer une valeur datetime dans une table de base de données SQL où le type de colonne est datetime?

26
sama

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();
78
Thorsten Dittmar
 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 ..

16
Reshma

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.

7
Andrea
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. 

3
Joel

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.

1
joonas