mysql date_sub используя поле в качестве интервала - PullRequest
5 голосов
/ 24 апреля 2011

Мне нужна помощь с mysql и date_sub ().У меня есть табличный вызов Activity

Activity(id,deadline,alert)
Activity(1,'2011-04-18','1 DAY');
Activity(2,'2011-04-13','1 MONTH');

В каждой строке в A есть «alert», в этом поле указывается время, за которое должно быть сообщено о деятельности.

Например,

On 2011-04-17 I have to report the activity with 'id' 1
On 2011-03-14 I have to report the activity with 'id' 2

Я пытаюсь использовать функции date_sub(), но не могу использовать поле в качестве параметров этой функции.Есть идеи как это исправить?

SELECT * 
  FROM `activities` 
 WHERE date_sub(`deadline`, INTERVAL alert) >= CURDATE();

Ответы [ 4 ]

2 голосов
/ 24 апреля 2011

Если количество предупреждений невелико, вы можете написать case:

WHERE case 
      when alert = '1 DAY' then date_sub(`deadline`, INTERVAL 1 DAY) 
      when alert = '1 MONTH' then date_sub(`deadline`, INTERVAL 1 MONTH) 
      ... etc ...
      end >= CURDATE();
2 голосов
/ 24 апреля 2011

Разделить предупреждение на 2 поля

Alert_count: integer
Alert_period: enum('hour','day','month','week')

и изменить запрос следующим образом:

SELECT * 
  FROM `activities` 
 WHERE CASE alert_period 
   WHEN 'hour' THEN date_sub(`deadline`, INTERVAL alert_count HOUR) >= CURDATE();
   WHEN 'day' THEN date_sub(`deadline`, INTERVAL alert_count DAY) >= CURDATE();
   ...
 END CASE
0 голосов
/ 24 апреля 2011

Хотя это решение будет работать, это не самый эффективный способ хранения этих данных, потому что каждый раз, когда вы запрашиваете эти данные, MySQL должен смотреть на значение интервала в каждой строке, вычислять его по дате крайнего срока и затем возвращать вам ответ.

Если вы вычислите эту информацию непосредственно перед вставкой данных и сохраните alert_date в виде столбца DATE, то (при условии, что вы тоже проиндексировали его) MySQL будет очень быстро находить строки сзапрос типа:

SELECT id FROM activity WHERE alert=CURRENT_DATE();

еще более эффективен (он позволил бы его кэшировать запрос):

SELECT id FROM activity WHERE alert="2011-04-23";
0 голосов
/ 24 апреля 2011

Строки не допускаются после ИНТЕРВАЛА, вы можете конвертировать все лимиты предупреждений в день для одного столбца.

Activity(id,deadline,alert)
Activity(1,'2011-04-18','1');
Activity(2,'2011-04-13','30'); 

и использовать как:

SELECT * 
  FROM `activities` 
 WHERE date_sub(`deadline`, INTERVAL alert DAY) >= CURDATE();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...