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, есть инструменты, помогающие с обработкой / преобразованием часовых поясов.
Обязательно держите время в универсальном формате. Это изменит мир, если вам придется работать в нескольких часовых поясах.