Member 14089908 Ответов: 1

Поиск в datatable с datetime в C#


Привет,
У меня есть небольшая проблема, я хочу получить все записи в datatable между двумя датами и временем. Пожалуйста, посмотрите на код ниже. Я хочу получить все записи между "25/5/2019 21:43:24 PM" и "25/5/2019 05:32:42 AM". Что я могу сделать, пожалуйста, посоветуйте.
Заранее спасибо.

Что я уже пробовал:

DataTable table = new DataTable();
		table.Columns.Add(new DataColumn("ShiftStartDateTime", typeof (DateTime)));
		table.Columns.Add(new DataColumn("ShiftEndDateTime", typeof (DateTime)));
		
		table.Rows.Add("5/25/2019  10:20:29 PM","5/25/2019  10:59:36 PM");		
		table.Rows.Add("5/26/2019  9:43:24 PM","5/26/2019  9:43:14 PM");		
		table.Rows.Add("5/26/2019  9:43:24 PM","5/26/2019  11:19:41 PM");		
		table.Rows.Add("5/26/2019  9:43:24 PM","5/27/2019  4:22:14 AM");		
		table.Rows.Add("5/26/2019  9:43:24 PM","5/27/2019  4:23:29 AM");		
		table.Rows.Add("5/26/2019  9:43:24 PM","5/27/2019  5:32:42 AM");
		DateTime d1 = new DateTime(2019,05,26,21,43,24);
        DateTime d2 = new DateTime(2019, 05, 26, 5, 32, 42);
		DataRow[] rows = table.Select("ShiftStartDateTime >=#"+d1.ToString("yyyy/MM/dd hh:mm:ss tt")+"#"+"AND ShiftEndDateTime <=#"+d2.ToString("yyyy/MM/dd hh:mm:ss tt")+"#");
		foreach (var r in rows)
        {
        	//do something here.
        }

Gerry Schmitz

Сначала вы "что-то делаете". И я угадал правильно.

BillWoodruff

Опишите ошибку, которая у вас сейчас есть: в чем она заключается ? где это происходит ?

Richard MacCutchan

Вы объявили свои столбцы как типы DateTime, но затем пытаетесь добавить строки, содержащие строковые значения. Не используйте строки для значений DateTime, используйте только значения DateTime. Единственный раз, когда вам нужно преобразовать их в строки, - это когда вы хотите отобразить их в удобочитаемой форме.

Member 14089908

У меня есть проблема только в следующем коде.
DataRow[] rows = таблица.Выберите("ShiftStartDateTime >=#"+d1.ToString("yyyy/MM/dd hh:mm:ss tt")+"#"+"и ShiftEndDateTime <=#"+d2.ToString("гггг/ММ/ДД чч:мм:СС ТТ")+"#");
У вас есть какие-нибудь предложения?

Richard MacCutchan

Да, как я уже предлагал, прекратите использовать строки и используйте только типы DateTime.

Member 14089908

Ты имеешь в виду, что я могу сделать вот так?
DataRow[] rows = таблица.Выберите("ShiftStartDateTime >=#"+d1+"#"+"и ShiftEndDateTime <=#"+d2+"#");
Спасибо

Richard MacCutchan

Нет. Повторяю, не используйте (и не пытайтесь использовать) строки для сравнения дат. Используйте правильные объекты DateTime в своей базе данных, datatable и коде.

Member 14089908

Привет Ричард,
Не могли бы вы дать пример кода.
Спасибо

Richard MacCutchan

Просто измените все ваши строки даты на объекты DateTime.

1 Ответов

Рейтинг:
2

Maciej Los

Взгляните на свой код:

DateTime d1 = new DateTime(2019,05,26,21,43,24);
DateTime d2 = new DateTime(2019, 05, 26, 5, 32, 42);


d1 больше d2 Итак... это условие: ShiftStartDateTime>=d1 AND ShiftStartDateTime <=d2 никогда не сбудется!

Попробовать это:
DataRow[] rows = table.Select(string.Format("ShiftStartDateTime>=#{0}# AND ShiftEndDateTime<=#{1}#", d2, d1));
//returns:
//ShiftStartDateTime  ShiftEndDateTime
//2019-05-26 21:43:24 2019-05-26 21:43:14 
//
//Note, that my default culture is: PL-pl