Как мне работать с БД через C# для удаления даты которая старше одним днём настоящей/нынешней
прошу пожалуйста помощи в организации кода в C# классе Program.cs для удаления даты старше одним днём от нынешней.
Вот смог только разобраться по команде удаления конкретной даты из столбца, но не знаю как описать условие в коде по своей цели.
Сам запрос:
DELETE FROM dbo.Messages WHERE [When] = '2020-12-13 14:31:46.5894343'
Часть из самого Program.cs класса:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
// строка подключения к БД
string connStr = "Data Source=NAME-SERVER\\SQLEXPRESS;Initial Catalog=ChatDB;Integrated Security=True";
// создаём объект для подключения к БД
SqlConnection conn = new SqlConnection(connStr);
// устанавливаем соединение с БД
conn.Open();
// запрос
string sql = "DELETE FROM dbo.Messages WHERE [When] = '2020-12-13 14:31:46.5894343'";
// объект для выполнения SQL-запроса
SqlCommand command = new SqlCommand(sql, conn);
// закрываем соединение с БД
conn.Close();
}
Ответы (2 шт):
Спасибо пользователю @aepot ! Вот верный рабочий код:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
// строка подключения к БД
string connStr = "Data Source=NAME-SERVER\\SQLEXPRESS;Initial Catalog=ChatDB;Integrated Security=True";
// создаём объект для подключения к БД
SqlConnection conn = new SqlConnection(connStr);
// устанавливаем соединение с БД
conn.Open();
// запрос
string sql = "DELETE FROM dbo.Messages WHERE DAY([When]) < DAY(CURRENT_TIMESTAMP) OR MONTH([When]) < MONTH(CURRENT_TIMESTAMP) OR YEAR([When]) < YEAR(CURRENT_TIMESTAMP)";
// объект для выполнения SQL-запроса
SqlCommand command = new SqlCommand(sql, conn);
//выполняем и закрываем соединение с БД
command.ExecuteNonQuery();
conn.Close();
}
Лучше не писать запросы, которые выбирают (удаляют) данные по результатам вычисления надо полем. Для того, чтобы узнать результат проверки вида DAY([When]) < DAY(CURRENT_TIMESTAMP) OR MONTH([When]) SQL Server должен будет вычитать значение [When] для всех строк, посчитать DAY([When]), сделать проверку и тогда уже удалить.
К тому же это значит, что он вычитает с диска всю таблицу. На больших объемах это может быть достаточно дорого и по IO, и по CPU.
Лучше просчитать константу (дату, до которой надо удалить записи), и удалять с прямым сравнением. Это уберет CPU. Можно еще индекс создать (это уберет вычитываение всей таблицы, но может быть дороже, если удаляется большая часть строк таблицы.
DELETE FROM dbo.Messages
WHERE [When] < DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Индекс под удаление:
CREATE INDEX Messages_When
ON Messages ([when]);
Индекс будет эффективен только при удалении небольшого количества строк. Если у вас удаляется почти вся таблица - будет обратный эффект - индекс будет тормозить процесс.