Member 14089908 Ответов: 5

Как искать в объект DataTable с помощью типа данных datetime


Всем Привет,
У меня есть DataTable, который содержит три столбца ID, Shift Start и Shift End
Идентификатор | сдвиг начала | конца смены
1 | 4/12/2018 7:00:00 AM | 4/12/2018 11:00:00 PM
Теперь проблема в том, что я хочу выбрать все записи в пределах этой даты и времени. Я попробовал следующий код, но он не работал.
Пожалуйста, помогите мне.
Заранее спасибо.

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

// Это ключевое время / временной интервал, в течение которого я хочу выполнить поиск
DateTime d = Convert.ToDateTime("4/12/2018 22:53");
           string strD = d.ToString("hh:mm:ss tt");
           // Presuming the DataTable has a column named Date.
           string expression;
           expression = "[Shift Start] > #4/12/2018 " + strD + "# AND [Shift End] < #4/12/2018 " + strD + "#";
           DataRow[] foundRows;

           // Use the Select method to find all rows matching the filter.
           foundRows = dt.Select(expression);

           // Print column 0 of each returned row.
           for (int i = 0; i < foundRows.Length; i++)
           {
               MessageBox.Show(foundRows[i][1].ToString());
           }

Richard Deeming

Ваш запрос не имеет смысла. Сколько смен оба старта после 22:53, и конец до 22:53 в тот же день?

Если вы ищете записи, которые перекрывают указанное время, то вам нужно отменить свои сравнения. Если вы ищете что-то другое, то вам нужно объяснить.

Member 14089908

Спасибо, Ричард, что уделил мне время. На самом деле я хочу искать в пределах начала смены и конца смены, пожалуйста, за столом дайте ниже.
Идентификатор | сдвиг начала | конца смены
1 | 4/12/2018 7:00:00 AM | 4/12/2018 23:00:00 PM
Теперь я хочу получить все значения в течение 4/12/2018 22:53 этой даты и времени.
Большое спасибо.

5 Ответов

Рейтинг:
36

RickZeeland

Вы можете использовать LINQ подобный этому:

IEnumerable<DataRow> selectedRows = dt1.AsEnumerable()
    .Where(row => (row.Field<DateTime>("Shift Start") <= d) && (d <= row.Field<DateTime>("Shift End")));

foreach (DataRow row in selectedRows)
{
    Console.WriteLine("{0}, {1}", row[0], row[1]);
}


Member 14089908

Спасибо RickZeeland за ваше время, я попробовал ваше решение, но дал мне ошибку. "Указанное приведение недопустимо".

DateTime d = конвертировать.ToDateTime("4/12/2018 22:53");
IEnumerable<datarow> selectedRows = dt.Методом asenumerable()
.Где(строка =&ГТ; (ряд.Поле&ЛТ;типа datetime&ГТ;("пуск сдвига") &ГТ;= д) и усилитель; & (д &ЛТ;= ряд.Поле<datetime>("Shift End")));

foreach (строка DataRow в selectedRows)
{
Приставка.WriteLine("{0}", строка[0]);
}
Пожалуйста, помогите мне.
Спасибо

RickZeeland

Возможно, Вам не хватает оператора using, см. Полный пример ниже.

Рейтинг:
1

Patrice T

Цитата:
проблема в том, что я хочу выбрать все записи в пределах этой даты и времени. Я попробовал следующий код, но он не работал.

Вы хотите знать, какие люди работали в данный момент времени (dt).
Это значит, что люди с [Начала смены до dt и [конец смены] после этого dt проблема в том, что вы сделали это в обратном порядке, вы запросили людей, которые ищут это [Смена] после dt и [конец смены] раньше dt.
expression = "[Shift Start] < #4/12/2018 " + strD + "# AND [Shift End] > #4/12/2018 " + strD + "#";


Не ваш вопрос, а другая проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


0x01AA

SQL-инъекция в выражение фильтра для DataTable?
Кстати. Никакого голосования с моей стороны.

Patrice T

Привет,
Я согласен, что этот код безопасен, но если он объединит строки для построения запроса, он будет делать то же самое, когда это опасно. Так что, чем скорее он научится делать это правильно с параметрами, тем лучше.

Рейтинг:
1

kiran0624

string str=4/12/2018 11:00:00
если ваш поиск в таблице sql
выберите * из таблицы, где endshit='4/12/2018 11:00:00';


Рейтинг:
0

RickZeeland

Вот мой полный пример, протестированный в VS2017 с .NET 4.5.1:

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;

namespace TestForm1
{
    /// <summary>
    /// Codeproject DataTable
    /// </summary>
    public partial class Form1 : Form
    {
        DataTable dt1 = new DataTable();

        public Form1()
        {
            InitializeComponent();
            Test();
        }

        private void Test()
        {
            // Add columns
            dt1.Columns.Add("Shift Start", typeof(DateTime));
            dt1.Columns.Add("employee_id", typeof(string));
            dt1.Columns.Add("employee_name", typeof(string));
            dt1.Columns.Add("Shift End", typeof(DateTime));

            DateTime d = DateTime.Now;

            // Add test data
            dt1.Rows.Add(d.AddMinutes(-10), "1", "PRINCE", d.AddMinutes(-1));
            dt1.Rows.Add(d, "2", "KING", d.AddMinutes(2));
            dt1.Rows.Add(d.AddMinutes(1), "3", "PAUPER", d.AddMinutes(2));

            IEnumerable<DataRow> selectedRows = dt1.AsEnumerable()
                .Where(row => (row.Field<DateTime>("Shift Start") <= d) && (d <= row.Field<DateTime>("Shift End")));

            foreach (DataRow row in selectedRows)
            {
                Console.WriteLine("{0}, {1}", row[0], row[1]);
            }
        }
    }
}


Рейтинг:
0

pkfox

Ничего общего с вашим вопросом, но никогда не имейте пробелов в именах столбцов или таблиц - то же самое касается имен файлов и папок - просто скажите :-)