Обеспечение сравнения дат с различными настройками языка в БД и Приложении. - PullRequest
1 голос
/ 12 марта 2012

У меня есть запрос Linq to Entity, который сравнивает даты. Я запрашиваю базу данных SQL Server 2008, язык которой - американский английский. Мое приложение обрабатывает даты в формате дд / мм / гггг.

itemList = from i in _context.Items
    select i;

DateTime utcStartDate = DateTime.SpecifyKind(StartDate, DateTimeKind.Utc);
DateTime utcEndDate = DateTime.SpecifyKind(EndDate, DateTimeKind.Utc);

var items= from i in itemList
       where c.ModifiedDate.Date >= utcStartDate.Date  &&
             c.ModifiedDate.Date <= utcEndDate.Date
       select i;

Здесь StartDate и EndDate - это DateTime объекты, которые считываются из текстовых полей (вводятся только даты) и конвертируются в DateTime. Типичные значения: {8/3/2012 12:00:00 AM} на 08 марта 2012 года.

Вот как указывается значение при обновлении столбца в базе данных:

    item.ModifiedDate = DateTime.UtcNow.Date;

Я не могу изменить языковые настройки на сервере. Есть ли способ прочитать данные с сервера SQL и преобразовать их в формат "dd / MM / yyyy" перед сравнением дат? В качестве альтернативы, во что нужно преобразовать переменные Datetime, чтобы сравнение работало? Как правильно и эффективно это сделать?

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Формат применяется только при обработке данных как строк. Показанный код не делает этого! Он сравнивает их как даты, передавая параметры в их двоичном представлении. Таким образом, - это , никакой двусмысленности и никакого форматирования в любой точке.

В принципе, это не проблема. То, что вы спрашиваете, на самом деле очень похоже на выражение «как SQL-сервер упорядочивает целые числа как« 1,2, ..., 9,10,11 », а не« 1,10,11,2, ... 9 »- на что ответ «потому что он не рассматривает их как строки».

Чтобы быть точным, datetime на сервере sql фактически обрабатывается как десятичное число, где целая часть - это день, а десятичная часть - время; любой "дд / мм / гггг" или "гггг / мм / дд" и т. д. существует только для нас, бедных мясистых читателей. Сервер не смущается такими вещами.

1 голос
/ 12 марта 2012

, если вы используете DateTime объекты в вашем запросе linq на стороне c # и date объекты в определениях столбцов вашего сервера sql, это должно корректно обрабатываться linq2sql.Короче говоря, вам не нужно ничего делать.

Итак.

Какую проблему вы пытаетесь решить?

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

DateTime.SpecifyKind(EndDate, DateTimeKind.Utc);

И да, как и в другом ответе, тип данных DateTime будет автоматически обрабатываться в linq2entities.Поэтому вам нужно беспокоиться только о региональных форматах даты при представлении данных пользователю с помощью .ToString () или других методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...