SQL Server 2005 против ASP.net формат даты и времени путаница

Я нашел похожий вопрос о переполнении стека, но он не ответил на мой вопрос. Мне нужно убедиться, что мое приложение asp.net форматирует дату дд / мм / гггг так же, как и мой SQL Server 2005.

Как проверить, что культура даты (если так она называется) сервера соответствует тому, как я запрограммировал свое приложение? Существуют ли конкретные настройки базы данных и настройки ОС? Это таблица? Я не хочу переносить свои дни и месяцы.

благодарю вас

5 ответов

Решение

Когда вы извлекаете DateTime из базы данных, он должен быть в некультурном формате (например, объект DateTime, основанный на количестве тиков с определенной даты). Только когда вы конвертируете это значение в строку, вам нужно заботиться о культуре. В этих случаях вы можете использовать yourDateTimeValue.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture), чтобы убедиться, что информация отображается правильно.

Я верю, что если вы используете SqlParameters, ADO.NET позаботится обо всем остальном, и вам не придется об этом беспокоиться. Кроме того, это хорошо для защиты от атак SQL-инъекций!:)

** Остерегайтесь, потому что столбцы SQL DateTime не обнуляются, и их минимальное значение равно 1/1/1753, в то время как.net DateTimes не обнуляются с минимальными значениями 1/1/0001. **

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

я сорвал это с http://bytes.com/forum/thread767920.html:

com.Parameters.Add ("@ adate", SqlDbType.DateTime).Value = DateTime.Now;

Что ж, если вы храните поля даты и времени в БД, вам не стоит об этом беспокоиться.

Пока вы сохраняете даты в приложении строго типизированными (переменные DateTime) и отправляете даты через подготовленные операторы с помощью DBParameter/SqlParameter, ваша БД будет принимать их как есть.

Если вы используете строки для хранения ваших дат в коде, некоторые преобразования гарантируют, что вы отправите правильные значения:

string sqlCmd = @"SELECT *
   FROM MyTable
   WHERE MyDateField = CONVERT(datetime, '{0}', 101)";

// assuming myDateString is a string with a date in the local format
sqlCmd = string.Format(sqlCmd,
    Convert.ToDateTime(myDateString).ToString("yyyyMMdd"));

(код уродлив, но, надеюсь, он все поймет)

Как уже упоминали другие, вы должны быть в порядке хранения культурного времени. Я бы порекомендовал, чтобы вы хранили все свое время как стандартное время UTC. В SQL Server 2005 и более ранних версиях нет способа хранить информацию о часовом поясе, но если все хранится в универсальном времени, вы должны быть в порядке, потому что время может быть преобразовано в местное время позже.

SQL Server 2008 имеет некоторые типы данных, которые знают о часовых поясах, и если вы используете.NET 3.5, есть инструменты, помогающие с обработкой / преобразованием часовых поясов.

Обязательно держите время в универсальном формате. Это изменит мир, если вам придется работать в нескольких часовых поясах.

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