Лучший способ разобрать DateTime на сервер SQL - PullRequest
6 голосов
/ 22 января 2009

Мне было интересно, как лучше всего проанализировать объект DateTime на вашем SQL-сервере.

Где вы генерируете SQL в коде.

Я всегда использовал что-то вроде DateTime.Now.TolongDateString() и имел хорошие результаты, кроме сегодняшнего дня, когда я получил ошибку, и это заставило меня задуматься.

System.Data.SqlClient.SqlException: Conversion failed when converting datetime from character string

Итак, что все думают и рекомендуют для того, чтобы работать на всех серверах SQL, независимо от того, что там настроено ..

Может быть, что-то вроде DateTime.Now.ToString("yyyy/MM/dd")

Ответы [ 7 ]

14 голосов
/ 22 января 2009

есть только 2 безопасных формата

ISO и ISO8601

ISO = ггммдд

ISO8601 = гггг-мм-дд чч: мм: сс: ммм (без пробелов) (обратите внимание на T)

См. Также здесь: Установка стандартного формата даты для SQL Server

10 голосов
/ 24 июня 2010

Я обнаружил, что этот конкретный формат был необходим:

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff")

Оболочка для заметок и отсутствие пробелов. Это универсальный способ согласно Robyn Page .

10 голосов
/ 22 января 2009

Почему бы не параметризировать запрос и не передать значение DateTime в качестве входного параметра SQL DateTime?

например, INSERT INTO SomeTable (Blah, MyDateTime) VALUES (1, @MyDateTime)

Тогда вы можете быть действительно уверены. Даже если вы генерируете SQL, вы должны быть в состоянии обработать это специально?

5 голосов
/ 22 января 2009

Вы должны действительно использовать для этого параметризованные запросы и передать объект DateTime в качестве SQL DateTime параметра.

Если вы анализируете DateTime в String , вам придется работать с настройками локализации как на сервере приложений, так и на сервере базы данных. Это может привести к некоторым неприятным сюрпризам, таким как обработка даты, как она была в американском формате, с одной стороны и, например, Великобритания по другому. Строка 9/12/2000 может быть 12 сентября или 9 декабря. Поэтому сохраняйте данные в объекте / типе DateTime при обмене между приложением и базой данных.

Единственный раз, когда вы будете анализировать DateTime до String , будет при отображении данных (GUI). Но тогда вам следует убедиться, что вы используете правильную настройку локализации при разборе, чтобы отобразить ее в том формате, который ожидает пользователь.

Тот же принцип применяется к другим типам данных, например, float . Строковое представление этого зависит от локали, и я предполагаю, что вы не анализируете float до String при передаче его в базу данных, так зачем делать это с DateTime

3 голосов
/ 22 января 2009

Остерегайтесь, если дата DateTime.Min, так как SQL Server использует 1700 для начала самого времени. Я бы использовал формат даты и времени ISO: DateTime.ToString ("s"), но я не пробовал это на не западных установках.

, например

DateTime.Now.ToString("c")

есть

insert into testtable values ('2009-01-22T15:08:13')
3 голосов
/ 22 января 2009

этот никогда не подведет: DateTime.Now.ToString ("ггггММдд ЧЧ: мм: сс.ффф")

1 голос
/ 22 января 2009

Форматирование с использованием DateTime.ToString ("гггг-ММ-дд ЧЧ: мм: сс: ффф") будет соответствовать формату даты / времени MS SQL Server. (Я считаю, что SQL Server достаточно «интеллектуален» в распознавании немного отличающихся друг от друга форматов, например, с косой чертой, но я лично использовал этот формат успешно.)

РЕДАКТИРОВАТЬ: Как отметил комментатор, это может быть разрушено в некоторых регионах.

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