检查一组日期是否小于NOW() - mysql

时间:2014-02-05 17:55:31

标签: mysql loops stored-functions

我有一个"事件"表和" events_dates"表。 " events_dates"在" events"中引用了event_id。表。 我想构建一个存储函数,检查NOW()是否大于" events_dates"中的所有日期。引用特定的event_id。 我已经写了这个函数,以获得一个tinyint(1)值(如果为真则为1,如果为假则为0),但我总是假的。 而且,我觉得我迷路了。 你会在我的位置做什么?

我想在更大的查询中使用该函数,并使用它:

SELECT e.*, ed.*
FROM events e INNER JOIN
     events_dates ed
     ON e.event_id = ed.fk_event_id
 WHERE IF (checkIfAllDatesArePassed(e.event_id),DATEDIFF(ed.event_date,NOW())<0,DATEDIFF(ed.event_date,NOW())>0)

实际上它有点复杂,但我相信你明白了这一点:)

谢谢大家。

2 个答案:

答案 0 :(得分:0)

如果您只想要满足此条件的事件以及标志:

SELECT ed.event_id,
       (max(event_date) < now()) as AllDatesPast
FROM events_dates ed
group by event_id;

如果您需要事件信息,请加入events

SELECT e.*
FROM events e join
     events_dates ed
     on e.event_id = ed.fk_event_id
group by e.event_id
having max(event_date) < now();

如果你想要日期:

SELECT e.*, ed.*
FROM events e join
     events_dates ed
     on e.event_id = ed.fk_event_id
WHERE not exists (select 1
                  from event_dates ed2
                  where e.event_id = ed2.event_id and
                        event_date > now()
                 ) ;

答案 1 :(得分:0)

我会使用ALL关键字,例如

select *
from events
where now() > all (select event_date from events_dates where fk_event_id = event_id)

假设event_id是函数的参数。

但我无法理解checkIfAllDatesArePassed应该是什么。

从评论中更新:

drop function if exists checkIfAllDatesArePassed;
delimiter $$
create function checkIfAllDatesArePassed(event_id integer)
returns integer
language sql
begin
return select case
when now() > all (select event_date from events_dates where fk_event_id = event_id) then 1
else 0;
end;
$$
delimiter;

那会吗?