SQL Server 2005 противASP.net путаница в формате даты и времени
-
02-07-2019 - |
Вопрос
Я нашел аналогичный вопрос о переполнении стека, но на самом деле он не ответил на мой вопрос.Мне нужно убедиться, что мое asp.net приложение форматирует дату дд / мм / гггг так же, как мой SQL Server 2005.
Как мне проверить, что культура дат (если это так называется) сервера соответствует тому, как я запрограммировал свое приложение?Существуют ли конкретные настройки базы данных и операционной системы?Зависит ли это от конкретной таблицы?Я не хочу переносить свои дни и месяцы.
Спасибо
Решение
Когда вы получаете DateTime из базы данных, оно должно быть в некультурном формате (например, объект DateTime, основанный на количестве тиков с определенной даты).Только когда вы преобразуете это значение в строку, вам нужно учитывать культуру.В таких случаях вы можете использовать yourDateTimeValue .toString("дд/ММ /гггг", CultureInfo.InvariantCulture), чтобы убедиться, что информация отображается правильно.
Другие советы
Я верю, что если вы используете SqlParameters, ADO.NET позаботится обо всем остальном, и вам не придется беспокоиться об этом.Кроме того, это также полезно для защиты от атак SQL-инъекций!:)
** Будьте осторожны, потому что столбцы SQL DateTime не имеют значения null и их минимальное значение равно 1/1/1753, в то время как .net DateTimes не имеют значения null с минимальными значениями 1/1/0001.**
Если вы извлекаете данные из реального столбца DateTime, по умолчанию они всегда будут в одном и том же стандартном формате.Для сохранения данных в столбце вы можете указать SqlDbType.DateTime в своем параметре.
я сорвал это с http://bytes.com/forum/thread767920.html :
com.Parameters.Add("@adate", SqlDbType.DateTime).Значение = 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, есть инструменты, помогающие с обработкой / преобразованиями часовых поясов.
Обязательно сохраняйте время в универсальном формате.Это будет иметь огромное значение, если вам придется работать в нескольких часовых поясах.