Формат DateTime не соответствует формату в SQL Server - PullRequest
2 голосов
/ 23 февраля 2012

Формат DateTime.UtcNow.ToString() - - DD/MM/YYYY HH:MM:SS

Формат, который ожидает SQL Server Express, - - YYYY/MM/DD HH:MM:SS

Формат (SqlDateTime)DateTime.UtcNow - - DD/MM/YYYY HH:MM:SS

Насколько я знаю, оба являются британскими форматами.Я нахожусь в Великобритании и использую код и SQL Server Express на одном компьютере.

Я знаю, что могу указать формат в методе ToString(), но это не решает основную проблему.Почему SQL Server Express ожидает другой формат, когда он работает на той же машине?

Каков наилучший способ устранить это несоответствие, чтобы оно также работало при публикации на сервере (который может не иметь этогопроблема)?

Должен ли я синхронизировать форматы даты на моем компьютере и предположить, что все будет хорошо, когда я опубликую?Если да, то как мне это сделать?Или я должен обработать его в коде, определив каким-либо образом формат даты в SQL Server Express и заставив мой код создавать тот же формат?Если да, то как мне это сделать?

1 Ответ

10 голосов
/ 23 февраля 2012

Используйте стандартный, однозначный, не зависящий от языка и региональных настроек формат.Если вы должны использовать строку, передайте в следующем формате (который, я знаю, вы можете достичь в .NET с .ToString()):

YYYY-MM-DDTHH:MM:SS

Например:

Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"));

Причина этого предпочтительна в том, что не имеет значения, где выполняется ваш код, какие изменения вносятся в базовую операционную систему или какие изменения вносятся на стороне SQL Server, дата всегда будет правильной и не будет неверно истолкована.С указанным выше форматом вам никогда не придется беспокоиться, если он будет неверно истолкован по любой из множества причин, по которым это может произойти (настройки сеанса, такие как LANGUAGE и DATEFORMAT, региональные настройки, локаль, даже ваш собственный код, могут делать предположенияо формате входящей строки).Существует только пара действительно безопасных форматов для SQL Server, и mm/dd/yyyy и dd/mm/yyyy абсолютно не входят в их число.

Теперь я не уверен, почему вы используете строку в первую очередь.Наилучшая практика предполагает, что вы должны передавать параметр datetime из C #, а не строковый литерал.Нет причин конвертировать его в строку.Многие люди позволяют пользователям вводить даты вручную в текстовое поле и просто передавать то, что они вводят.Не делайте этого - заставляйте их выбирать из элемента управления календаря или набора раскрывающихся списков и строить из этого значение даты и времени.Если вы позволяете пользователям вводить даты, вы никогда не сможете быть уверены, что 09/07/2013 одного человека, на самом деле, 07/09/2013.

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

ModifiedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

Теперь вам не нужно передавать этот параметр из .NET или дажеупомяните имя столбца в вашей выписке INSERT.

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