Лучший способ разобрать DateTime на SQL-сервере

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

Теперь я использую .ToString ("yyyy-MM-dd HH: mm: ss: fff"), который работает нормально.

TheAlbear 16.10.2009 19:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
22 613
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Обновлено: Как отметил комментатор, это, вероятно, будет испорчено в некоторых местах.

этот не удастся для локали ydm

Mladen Prajdic 22.01.2009 17:58

этот никогда не подведет: 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 сентября в зависимости от настроек базы данных. Таким образом, вам никогда не гарантируется, как будет обрабатываться строка, которую вы передаете в БД, если вы не укажете форматирование.

kristof 22.01.2009 18:32

Кристоф, если вы собираетесь использовать тире в формате, тогда вам нужно использовать T. Если вы удалите тире, то он никогда не будет неправильно истолкован. Вместо «1997-12-09» используйте «19971209».

George Mastros 22.01.2009 18:39

Спасибо, Мастрос - я не знал об этом, думаю, можно чему-то научиться каждый день :)

kristof 22.01.2009 18:49

@SQLMenance - я оставлю первый комментарий, хотя я ошибался, говоря, что ваш ответ был неправильным.

kristof 22.01.2009 18:52

вставить в значения testtable ('0000-00-00T00: 00: 00') :)

Chris S 23.01.2009 04:42

Должен ли ISO8601 быть примерно таким? гггг-мм-ддчч: мм: сс.FFF

Iain 09.05.2011 14:53

Выше указаны неправильные часы (12-часовые). Должно быть yyyy-MM-ddTHH: mm: ss.FFF

Iain 09.05.2011 17:49

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

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

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

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

Я обнаружил, что нужен именно этот формат:

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

Обратите внимание на корпус и отсутствие пробелов. Это универсальный способ согласно Робин Пейдж.

Другие вопросы по теме