How do I insert a datetime value into a SQL database table where the type of the column is datetime?
8 Answers
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();

- 55,956
- 8
- 91
- 139
-
17+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. – D'Arcy Rittich Jun 23 '09 at 13:20
-
1Thanks ;-) I'm so used to using parameterzied queries I didn't even think about it. – Thorsten Dittmar Jun 23 '09 at 13:22
-
Unfortunately, this assumes the connection is setup such that the query will automatically convert between System.DateTime and MysqlDateTime. – iheanyi Feb 24 '17 at 00:00
-
I've never seen a case where this was not the case. – Thorsten Dittmar Feb 24 '17 at 06:36
-
1@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? – Thorsten Dittmar Feb 24 '17 at 07:13
-
Good point, I overlooked that. The answer will need some kind of edit for me to change the vote. – iheanyi Feb 24 '17 at 15:06
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..
-
9yyyy-MM-dd HH:MM:ss actually puts MONTH instead of minutes. It should be 'mm' – Radu Cojocaru Mar 18 '16 at 13:20
-
`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`. – MgSam Jul 16 '21 at 17:26
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.

- 2,059
- 2
- 14
- 15
-
You can also use dd-mmm-yyyy (e.g. 04-Jul-2009) but this is a bit harder to do :) – Jon Grant Jun 23 '09 at 13:23
-
3for month mm will be like MM otherwise it will show minutes instead of month. – m.qayyum Jan 24 '13 at 20:40
-
1I think you want to use "yyyy-MM-dd HH:mm:ss" instead of "yyyy-mm-dd hh:mm:ss". – Nicolai Schlenzig Mar 19 '20 at 16:15
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.

- 136
- 1
- 4
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.

- 19,175
- 2
- 63
- 83
-
2Anybody 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. – Jon Grant Jun 23 '09 at 13:21
-
@JonGrant in that case, how would you answer this question given that the mysql datetime format is 'YYYY-MM-DD HH:MM:SS'? – iheanyi Feb 24 '17 at 00:02
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'

- 2,083
- 3
- 24
- 30
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") );

- 157
- 1
- 3