Другой формат даты и времени возвращает неверный набор результатов в EF Core и LINQ. DateTime.ParseExact не работает - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть приложение ASP. NET Core MVC с культурой, установленной на en-GB с использованием формата даты и времени dd/mm/yyyy.

Я использую:

  • . NET Core 2.1
  • EF Core 2.2
  • SQL Сервер 2019 (v15)
  • Столбец даты имеет тип datetime2

Однако для одного из моих запросов мне нужно иметь формат yyyy-mm-dd при запросах через EF Core.

var xyx = db.zyz
            .Where(x => x.date >= startdate && x.date<= enddate)
            ......

Приведенный выше запрос не может вернуть набор результатов даже если в таблице zyz есть запись в соответствии с условием.

Я думаю, это происходит только тогда, когда startdate и enddate совпадают.

Например, предположим, что у zyz есть запись для даты 2020-04-19

Запрос

   var dt = DateTime.ParseExact("20200419","yyyyMMdd",CultureInfo.InvariantCulture);

    var xyx = db.zyz
                .Where(x=>x.date >= dt && x.date<= dt)
                ......

Не удается получить какие-либо строки. Он возвращает 0 строк.

Я думаю, что это из-за формата даты и времени.

Поле даты в zyz в БД имеет формат 2020-19-04 00:00:00.0000000

Два На ум приходят вопросы:

  • Это из-за формата даты-времени, который я не получаю в результате? Разве EF Core не заботится о форматировании?
  • Когда я использую ParseExact и другие средства для анализа даты в нужном формате. Это не работает. Я всегда получаю дату в формате dd/mm/yyyy.

Что я пробовал, для разбора даты:

var dt = DateTime.ParseExact("20200415","yyyyMMdd",CultureInfo.InvariantCulture);

DateTime theTime = DateTime.ParseExact("20200415",
                                        "yyyyMMdd",
                                        CultureInfo.InvariantCulture,
                                        DateTimeStyles.None);

var dts = DateTime.ParseExact("20200415", "yyyyMMdd",new CultureInfo("en-ZA"));

Вышеуказанные запросы всегда возвращают дату формата 19/04/2020 00:00:00

Как я понимаю, поскольку datetime - это просто тип данных, не должен ли запрос быть независимым от формата datetime и возвращать данные независимо от формата datetime?

1 Ответ

1 голос
/ 19 апреля 2020

Привет, ребята, сам запрос был неверным.

Что было не так:

В случае с одинаковыми датами начала и окончания:

var xyx = db.zyz
            .Where(x => x.date >= startdate && x.date<= enddate)
            ......

Я отправлял:

2020-04-19 00:00:00 для обоих

Я должен был отправить:

2020-04-19 00:00:00 - для даты начала 2020-04-19 11:59:00 - для даты окончания

Как указано Иваном Стоевым и Стефано Бальзаротти в комментариях.

Написал этот ответ, поскольку он поясняет, что datetime является типом и не имеет формата, как указано Jon Skeet в комментариях.

...