Выборка данных в определённом диапазоне ADO.NET SQLite

Использую БД SQLite. Необходимо получить данные из БД за определенный квант времени, что-то вроде BETWEEN (MySQL) по времени. Но есть нюанс, в БД время храниться набором значений: Г.М.Д.Ч.М.С. А не одной строкой.

введите сюда описание изображения

Вот запрос:

@$SELECT employeeId, year, month, day, hour, minute,
second FROM [employeers] WHERE date >= {startTime} AND date <= {endTime};

И сам блок кода:

public List<EmployeeDto> SelectEmployeeBetweenTimeStamp(string startTime, string endTime)
    {
        var employeeDto = new List<EmployeeDto>();
        
        using (var connection = new SqliteConnection(connectionString))
        {
            using (var command = new SqliteCommand())
            {
                connection.Open();
                command.Connection = connection;

                command.CommandText = @$SELECT id, employeeId, year, month, day, hour, minute, second, employeeName, employeeLastName FROM
                                    [employeers] WHERE date >= {startTime} AND date <= {endTime};


                command.CommandType = CommandType.Text;

                var reader = command.ExecuteReader();
                while (reader.Read())
                {
                    breezeDto.Add(new EmployeeDto
                    {
                        Id = Convert.ToInt32(reader["id"]),
                        EmployeeId = Convert.ToInt32(reader["employeeId"]),
                        Year = Convert.ToInt32(reader["year"]),
                        Month = Convert.ToInt32(reader["month"]),
                        Day = Convert.ToInt32(reader["day"]),
                        Hour = Convert.ToInt32(reader["hour"]),
                        Minutes = Convert.ToInt32(reader["minute"]),
                        Seconds = Convert.ToInt32(reader["second"]),
                        EmployeeName = reader["employeeName"].ToString(),
                        EmployeeLastName = reader["employeeLastName"].ToString()
                    });
                }
            }
        }

        throw new Exception();
    }

Входящие параметры это DateTime.ToString() точки начала и конца отсчета.

Как собрать дату из БД в одно целое и сравнить в запросе?


Ответы (2 шт):

Автор решения: Bulson

Разделение даты на отдельные столбцы откровенно неудачное решение.

Как выход: в классе EmployeeDto добавьте свойство

public DateTime ResultDate => new DateTime(this.Year, this.Month, ...)

и после прочтения всех данных из таблицы сможете работать с датами с помощью LINQ используя это свойство.

Если вы только на начальном этапе написания приложения, лучше измените структуру таблицы на хранение даты в одном столбце и тогда с датами можно будет работать сразу в SQL.

→ Ссылка
Автор решения: JDo

Как вариант, можно написать такой запрос, приведя в дату и время данные из БД

SELECT *, year || '-' || month || '-' || day || ' ' || hour || ':' || minute || ':' || second as DT 
FROM [employeers]
WHERE datetime(DT) BETWEEN datetime('2021-02-10 13:14:19') AND datetime('2021-02-15 13:14:19');

И сравнить с входящими параметрами из метода.

string startTime.ToString(yyyy-MM-dd HH:mm:ss), string endTime.ToString(yyyy-MM-dd HH:mm:ss)
→ Ссылка