47

How do I insert a datetime value into a SQL database table where the type of the column is datetime?

8 Answers 8

102

The following should work and is my recommendation (parameterized query):

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();
Sign up to request clarification or add additional context in comments.

6 Comments

+1 I am amazed how many answers here suggested non-parameterized queries. Using a parametereized query not only steps around SQL injection issues, but solves SQL Server date localization issues as well.
Thanks ;-) I'm so used to using parameterzied queries I didn't even think about it.
Unfortunately, this assumes the connection is setup such that the query will automatically convert between System.DateTime and MysqlDateTime.
I've never seen a case where this was not the case.
@iheanyi Aaaand we're not talking about MySQL here, so there's no reason to downvote. The question is about SQL Server, this answer is correct for SQL Server, so why downvote based on problems that might (but probably won't) arise with MySQL?
|
27
 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) + "')"; 

and execute the query. DateTime.Now is to insert current Datetime..

2 Comments

yyyy-MM-dd HH:MM:ss actually puts MONTH instead of minutes. It should be 'mm'
datetime2 in SQL Server defaults to a precision of 7 fractional seconds. A better format to use is yyyy-MM-dd HH:mm:ss.FFFFFFF.
8

It's more standard to use the format yyyy-mm-dd hh:mm:ss (IE: 2009-06-23 19:30:20)

Using that you won't have to worry about the format of the date (MM/DD/YYYY or DD/MM/YYYY). It will work with all of them.

3 Comments

You can also use dd-mmm-yyyy (e.g. 04-Jul-2009) but this is a bit harder to do :)
for month mm will be like MM otherwise it will show minutes instead of month.
I think you want to use "yyyy-MM-dd HH:mm:ss" instead of "yyyy-mm-dd hh:mm:ss".
2

This is an older question with a proper answer (please use parameterized queries) which I'd like to extend with some timezone discussion. For my current project I was interested in how do the datetime columns handle timezones and this question is the one I found.

Turns out, they do not, at all.

datetime column stores the given DateTime as is, without any conversion. It does not matter if the given datetime is UTC or local.

You can see for yourself:

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}");
        }
    }
}

What this will print will of course depend on your time zone but most importantly the read values will all have Kind = Unspecified. The first and second output line will be different by your timezone offset. Second and third will be the same. Using the "o" format string (roundtrip) will not show any timezone specifiers for the read values.

Example output from 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

Also note of how the data gets truncated (or rounded) to what seems like 10ms.

Comments

1
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();
}

It's been awhile since I wrote this stuff, so this may not be perfect. but the general idea is there.

WARNING: this is unsanitized. You should use parameters to avoid injection attacks.

EDIT: Since Jon insists.

2 Comments

Anybody ever inserting a date into a database in a format where the day and month are ambiguous should never be allowed near a database ever again, IMO.
@JonGrant in that case, how would you answer this question given that the mysql datetime format is 'YYYY-MM-DD HH:MM:SS'?
0

I got this error from a stupid mistake - remember not to put the parameter in invreted commas, so use MY_DATE_FIELD=@mydate NOT MY_DATE_FIELD='@mydate'

Comments

-1

you can send your DateTime value into SQL as a String with its special format. this format is "yyyy-MM-dd HH:mm:ss"

Example: CurrentTime is a variable as datetime Type in SQL. And dt is a DateTime variable in .Net.

DateTime dt=DateTime.Now;
string sql = "insert into Users (CurrentTime) values (‘{0}’)";

sql = string.Format(sql, dt.ToString("yyyy-MM-dd HH:mm:ss") );

Comments

-11
INSERT INTO <table> (<date_column>) VALUES ('1/1/2010 12:00')

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.