Как мне работать с БД через 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();
        }
→ Ссылка
Автор решения: PashaPash

Лучше не писать запросы, которые выбирают (удаляют) данные по результатам вычисления надо полем. Для того, чтобы узнать результат проверки вида 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]);

Индекс будет эффективен только при удалении небольшого количества строк. Если у вас удаляется почти вся таблица - будет обратный эффект - индекс будет тормозить процесс.

→ Ссылка