Мне было интересно, как лучше всего разобрать объект 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")





Форматирование с использованием DateTime.ToString ("гггг-ММ-дд ЧЧ: мм: сс: fff") будет соответствовать формату даты / времени MS SQL Server. (Я считаю, что SQL Server довольно "умный" в распознавании форматов, которые выглядят немного иначе, например, с косой чертой, но я лично успешно использовал этот формат.)
Обновлено: Как отметил комментатор, это, вероятно, будет испорчено в некоторых местах.
этот не удастся для локали ydm
этот никогда не подведет: DateTime.Now.ToString ("ггггММдд ЧЧ: мм: сс.fff")
Почему бы не параметризовать запрос и не передать значение DateTime в качестве входного параметра SQL DateTime?
например, INSERT INTO SomeTable (Blah, MyDateTime) VALUES (1, @MyDateTime)
Тогда вы можете быть уверены. Даже если вы генерируете SQL, вы сможете справиться с этим специально?
Следите за датой DateTime.Min, поскольку SQL Server использует 1700 секунд для начала самого времени. Я бы использовал формат даты и времени ISO: DateTime.ToString ("s"), но я не пробовал это при установках не для западных стран.
например
DateTime.Now.ToString("c")
является
insert into testtable values ('2009-01-22T15:08:13')
есть только 2 безопасных формата
ISO и ISO8601
ISO = ггммдд
ISO8601 = гггг-мм-дд Thh: мм: сс: ммм (без пробелов) (обратите внимание на букву T)
См. Также здесь: Установка стандартного DateFormat для SQL Server
Я боюсь, что это не соответствует действительности в базе данных, даже если строка «1997-12-09» может трактоваться как 9 декабря или 12 сентября в зависимости от настроек базы данных. Таким образом, вам никогда не гарантируется, как будет обрабатываться строка, которую вы передаете в БД, если вы не укажете форматирование.
Кристоф, если вы собираетесь использовать тире в формате, тогда вам нужно использовать T. Если вы удалите тире, то он никогда не будет неправильно истолкован. Вместо «1997-12-09» используйте «19971209».
Спасибо, Мастрос - я не знал об этом, думаю, можно чему-то научиться каждый день :)
@SQLMenance - я оставлю первый комментарий, хотя я ошибался, говоря, что ваш ответ был неправильным.
вставить в значения testtable ('0000-00-00T00: 00: 00') :)
Должен ли ISO8601 быть примерно таким? гггг-мм-ддчч: мм: сс.FFF
Выше указаны неправильные часы (12-часовые). Должно быть yyyy-MM-ddTHH: mm: ss.FFF
Вы действительно должны использовать для этого параметризованные запросы и передавать свой объект DateTime в качестве параметра SQL DateTime.
Если вы проанализируете DateTime на Нить, вам придется иметь дело с настройками локализации как на вашем сервере приложений, так и на сервере базы данных. Это может привести к неприятным сюрпризам, таким как обработка даты так, как она была в американском формате с одной стороны и, например, Великобритания по другому. Строка 9/12/2000 может быть 12 сентября или 9 декабря. Поэтому сохраняйте данные в объекте / типе DateTime при обмене между приложением и базой данных.
Единственный раз, когда вы будете разбирать DateTime в Нить, будет при отображении данных (GUI). Но тогда вы должны убедиться, что используете правильную настройку локализации при синтаксическом анализе, чтобы отобразить ее в формате, ожидаемом пользователем.
Тот же принцип применяется к другим типам данных, например, плавать. Строковое представление этого различается в зависимости от локали, и я полагаю, вы не анализируете плавать в Нить при передаче его в базу данных, так зачем это делать с DateTime?
Я обнаружил, что нужен именно этот формат:
DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff")
Обратите внимание на корпус и отсутствие пробелов. Это универсальный способ согласно Робин Пейдж.
Теперь я использую .ToString ("yyyy-MM-dd HH: mm: ss: fff"), который работает нормально.