Выборка данных в определённом диапазоне 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 шт):
Разделение даты на отдельные столбцы откровенно неудачное решение.
Как выход: в классе EmployeeDto добавьте свойство
public DateTime ResultDate => new DateTime(this.Year, this.Month, ...)
и после прочтения всех данных из таблицы сможете работать с датами с помощью LINQ используя это свойство.
Если вы только на начальном этапе написания приложения, лучше измените структуру таблицы на хранение даты в одном столбце и тогда с датами можно будет работать сразу в SQL.
Как вариант, можно написать такой запрос, приведя в дату и время данные из БД
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)
