SQL удаляет все строки с датой старше x дней - PullRequest
0 голосов
/ 18 октября 2018

У меня есть таблица, как показано ниже, и я пытаюсь удалить все строки с createDate старше 10 дней с текущей даты, как и последние 3 потока, которые будут удалены из таблицы

ID  Name    createdDate(string)
76  Stream1 2018-10-18T00:00:00 
70  Stream2 2018-10-17T00:00:00 
50  Stream3 2018-10-03T00:00:00 
32  Stream4 2018-09-22T00:00:00 
21  Stream5 2018-09-21T00:00:00 

Я пытался ниже запрошен, но нене работает, может кто-нибудь помочь

DELETE FROM myTable WHERE TO_DATE(createdDate) < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 10 DAY))

DELETE FROM myTable WHERE TO_DATE(createdDate) < NOW()- INTERVAL 10 DAY;

Ответы [ 5 ]

0 голосов
/ 18 октября 2018

Для производительности, чтобы разрешить MySQL использовать сканирование диапазона (используя индекс с createdDate в качестве ведущего столбца), я бы сослался на bare столбца в предложении WHERE.

Я бы сделал все необходимые манипуляции на буквальной стороне сравнения, чтобы получить строку, с которой мы можем сравнить пустой столбец.

Сначала я написал бы инструкцию SELECT, чтобы убедиться, чтоон работает (прежде чем мы запустим DELETE и обнаружим, что он удаляет больше, чем мы ожидали)

Мы можем проверить выражения в простом операторе SELECT, например,

SELECT DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00') AS dt 

Затем мы можем использовать этовыражение в предложении WHERE

SELECT t.* 
  FROM myTable t 
WHERE t.createddate  <   DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00')
ORDER BY t.createddate DESC

Это выражение использует полночь '00:00:00' в качестве компонента времени;Есть другие выражения, которые достигли бы эквивалентного результата.

WHERE t.createddate  <   DATE_FORMAT( DATE(NOW()) + INTERVAL -10 DAY , '%Y-%m-%dT%T')

Нам действительно нужно сузить круг и конкретизировать, что означает «старше 10 дней, чем текущая дата».

Как только мы убедились, что запрос возвращает строки, которые мычтобы удалить, я бы преобразовал это в оператор DELETE, заменив ключевое слово SELECT и пропустив ORDER BY

SELECT t.* 
  FROM myTable t 
WHERE t.createddate  <   DATE_FORMAT( NOW() + INTERVAL -10 DAY , '%Y-%m-%dT00:00:00')
0 голосов
/ 18 октября 2018

В MySQL нет функции TO_DATE.Вы можете попробовать этот запрос вместо:

DELETE FROM myTable WHERE DATE(createDate) < DATE_SUB(NOW(), INTERVAL 10 DAY);
0 голосов
/ 18 октября 2018

В MySQL нет функции To_date().Вместо этого вам нужно будет использовать Str_To_Date() функцию:

DB Fiddle DEMO

DELETE FROM myTable 
WHERE STR_TO_DATE(createdDate, '%Y-%m-%dT%T') < NOW()- INTERVAL 10 DAY;

Подробности:

  • %Y Год в виде числового значения из 4 цифр
  • %m Название месяца в виде числового значения (от 00 до 12)
  • %d Деньмесяца в виде числового значения (от 01 до 31)
  • %T Время в 24-часовом формате (чч: мм: сс)
  • В вашей дате и времени есть дополнительная подстрока 'T'строка.Это представляется непосредственно с помощью T
0 голосов
/ 18 октября 2018

я думаю, что преобразование даты нужно в обе стороны сравнения

   DELETE FROM myTable 
   WHERE DATE(createdDate) < date(NOW()- INTERVAL 10 DAY);
0 голосов
/ 18 октября 2018

Я не думаю, что to_date() - это функция в MySQL.Просто используйте date():

DELETE FROM myTable
WHERE DATE(createdDate) < NOW() - INTERVAL 10 DAY;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...