Форматирование SQL дружественных Дата / Время в C # - PullRequest
3 голосов
/ 17 декабря 2011

Я строю несколько тестовых сценариев для своего приложения. Для этого у меня есть код, который генерирует SQL, чтобы помочь мне правильно тестировать. Пример сгенерированного SQL показан здесь:

INSERT INTO MyTable
(
 [ID],
 [Name],
 [CheckInDate],
 [CheckOutDate]
)
VALUES
(
  1,
  'A title',
  'Sat, 17 Dec 2011 14:33:12 GMT',
  'Sat, 17 Dec 2011 15:13:12 GMT'
)

Когда я пытаюсь выполнить этот SQL, я получаю следующее: Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Как я могу отформатировать строки даты / времени, чтобы SQL Server 2008 принимал их? Мне действительно нужен мой код C # для генерации SQL (включая элементы даты / времени) для правильного создания моих тестов.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 17 декабря 2011

Чтобы решить эту проблему, используйте формат даты ISO-8601 , поддерживаемый SQL Server - этот формат работает всегда - независимо от настроек языка SQL Server и формата даты.

Формат ISO-8601 поддерживается SQL Server в двух вариантах:

  • YYYYMMDD только для дат (без временной части) - примечаниездесь: без тире! , это очень важно!YYYY-MM-DD равно НЕ независимо от настроек формата даты в SQL Server и будет НЕ работать во всех ситуациях!

или:

  • YYYY-MM-DDTHH:MM:SS для дат и времени - обратите внимание, здесь: этот формат имеет тире.

Это действительно для SQL Server 2000 и новее.

Если вы используете SQL Server 2008 и тип данных DATE (только DATE - , а не DATETIME!), То вы также можете использовать формат YYYY-MM-DD, и это тоже будет работать,с любыми настройками в вашем SQL Server.

Не спрашивайте меня, почему вся эта тема такая хитрая и несколько запутанная - так оно и есть.Но с форматом YYYYMMDD вам подойдет любая версия SQL Server и любые настройки языка и даты в вашем SQL Server.

2 голосов
/ 17 декабря 2011

Вы можете использовать SqlParameters .

Таким образом, ваша команда будет:

INSERT INTO MyTable
(
 [ID],
 [Name],
 [CheckInDate],
 [CheckOutDate]
)
VALUES
(
  1,
  'A title',
  @CheckInDate,
  @CheckOutDate
)

И вы вставите даты следующим образом:

SqlParameter checkin = new SqlParameter("@CheckInDate", SqlDbType.DateTime);
SqlParameter checkout = new SqlParameter("@CheckOutDate", SqlDbType.DateTime);

checkin.Value = DateTime.Today; // Format these to the desired dates
checkout.Value = DateTime.Today;

command.Parameters.Add(checkin);
command.Parameters.Add(checkout);
1 голос
/ 17 декабря 2011

Лучше было бы вообще не форматировать даты, параметризировать оператор insert и передавать даты в качестве параметров команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...