SQLITE не выводит определенные данные
Есть база данных SQLITE в ней ряд полей, в том числе дата и время, в приложении WPF я пишу запрос по которому на странице с историей операций должны выводится данные из таблицы SQLite. В целом все работает, но почему то выводятся все данные кроме определенной даты, а именно сегодняшней 12.09, при этом выводятся данные по любой другой сортировке.. все операции за месяц или за определенный день, но именно за этот день не выводятся, даже если изменить в БД последнюю операцию за 12.09 и прописать ей дату 12.08 то в операциях за август её нет.. такое ощущение что, начиная с операций от 12.09 не по дате а по фактическому месту в БД эти операции почему не видны для команд.. есть идеи ?
string sMonth = DateTime.Now.ToString("MM"); //узнаем текущий месяц
var connection = new SqliteConnection("Data Source=B.Zanachka.db");
connection.Open();
SqliteCommand command = new SqliteCommand();
command.Connection = connection;
command.CommandText = $"SELECT * FROM Moneys WHERE Дата_Время LIKE '___{sMonth}______________' ORDER BY id DESC"; //при открытии окна историй операций, изначально видим операции за весь текущий месяц
ListHistory.ItemsSource = command.ExecuteReader();
Ответы (3 шт):
'___{sMonth}______________'
здесь требование иметь 14 знаков после месяца, а транзакции за утро 12-го числа имеют только 13. Сделайте, чтобы время сохранялось с предваряющим нулём для одноциферного значения и всё заработает как надо.
Можно попробовать вот такой шаблон поиска, поскольку точки с обеих сторон у вас только у месяца встречаются:
WHERE Дата_Время LIKE '%.{sMonth}.%'
Вы привязываетесь к конкретному числу позиций в дате, а это не всегда может быть корректно - см. ответ Lem0nti.
Но в целом это какой-то кривой способ, всё-таки корректнее хранить данные именно в виде поля типа дата-время, брать из неё нужный компонент - месяц - и именно его сравнивать с нужным, а не искать в строке.
В sqlite нет типа DateTime, но есть мощный набор функций для работы с датой и временем: Date And Time Functions.
Чтобы их использовать, вам нужно перейти на формат ISO-8601. Это даст возможность не только использовать эти функции, но и массу других достоинств. В частности, сортировка по дате станет элементарной.
Когда сохраняете значение типа дата-время в БД, используйте формат s:
DateTime.Now.ToString("s")
Это так называемый sortable (сортируемый) формат, соответствующий стандарту ISO-8601. Значения в БД будут выглядеть так: 2022-09-10T15:23:11.
Теперь при поиске данных в БД можно использовать функции sqlite.
string month = DateTime.Now.ToString("MM");
var sql = $"SELECT * FROM [Moneys] WHERE strftime('%m', Дата_Время) = @month ORDER BY id DESC;";
using var connection = new SqliteConnection("Data Source=test.db");
connection.Open();
using var command = new SqliteCommand(sql, connection);
command.Parameters.Add("month", SqliteType.Text).Value = month;
ListHistory.ItemsSource = command.ExecuteReader();
Обратите внимание на using - это автоматически освободит ресурсы, даже в случае исключения.
Обратите внимание на применение параметризованного запроса - это увеличит производительность, т. к. в кэше БД будет храниться только один план запроса.
