Это более старый вопрос с правильным ответом (, пожалуйста, используйте параметризованные запросы ), который я хотел бы продолжить с некоторыми обсуждениями часовых поясов. Для моего текущего проекта меня интересовало, как столбцы datetime
обрабатывают часовые пояса, и этот вопрос я нашел.
Оказывается, совсем нет.
Столбец
datetime
хранит данный DateTime
как есть, без преобразования. Не имеет значения, является ли указанное время и время UTC или местным.
Вы можете убедиться сами:
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}");
}
}
}
То, что это будет печатать, конечно, будет зависеть от вашего часового пояса, но , что наиболее важно, все прочитанные значения будут иметь Kind = Unspecified
. Первая и вторая выходные строки будут отличаться смещением вашего часового пояса. Второй и третий будут одинаковыми. Использование строки формата "o" (в обе стороны) не покажет никаких спецификаторов часового пояса для прочитанных значений.
Пример вывода из 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
Также обратите внимание на то, как данные усекаются (или округляются) до значения, равного 10 мс.