日期部分的MySQL查询

日期部分的MySQL查询,mysql,switch-statement,Mysql,Switch Statement,我有两张桌子 tblEvent -------- id date tblEventRecurring ----------------- event_id date_part end_date 关系是我可以有一个事件,它要么在tblEvent中的一天日期,要么在tbleventercurring表中的间隔日、周、月、年递归 例如,如果我把2月10日的一个活动安排在2月28日之前,我会 tblEvent -------- id = 1 date = 2012-02-10 tblEventRe

我有两张桌子

tblEvent
--------
id
date

tblEventRecurring
-----------------
event_id
date_part
end_date
关系是我可以有一个事件,它要么在tblEvent中的一天日期,要么在tbleventercurring表中的间隔日、周、月、年递归

例如,如果我把2月10日的一个活动安排在2月28日之前,我会

tblEvent
--------
id = 1
date = 2012-02-10

tblEventRecurring
-----------------
event_id = 1
date_part = D
end_date = 2012-02-28
构造查询以获取满足以下条件的所有日期的最佳方法是什么

tblEvent.date=今天 如果tbleventercurring.date\u part=D且今天<结束日期 如果tbleventercurring.date\u part=W,且今天与tblEvent.date和 谢谢你的指导。 D

由于我因不做研究而被否决,我想我应该发布我的最后一个问题。。。我正在努力处理一些AND/OR和括号。我做了研究,并阅读了更多我从未使用过的案例,所以我希望有人能用它来指导我的查询

# where the current date is 2012-02-12
SELECT e.record_id, e.event_date, 
       DATE_FORMAT(e.event_time, '%l:%i %p') AS event_time, 
       e.category, pm.person_id, pm.status, pm.active
FROM tblEvent e 
JOIN tblTABLE pmd ON pmd.record_id = e.reference_id 
JOIN tblTABLE2 pm ON pm.record_id = pmd.t_id 
LEFT OUTER JOIN tblEventRecurring er ON er.event_id = e.record_id 
WHERE e.category = 'CAT' 
AND pm.planet_id = 1 # id of person
AND pm.active = 1 
AND pm.status = 'Read Only' 
AND (
    e.event_date = '2012-02-12' # the event is on current date
    OR ( 
        # recurring with no end date or end date in future
        er.end_date = '0000-00-00' OR er.end_date >= '2012-02-12'
        AND ( 
            e.event_date <= '2012-02-12' # recurring starts today or in past
            AND ( # meets any of the following
                (er.date_part = 'D') 
                OR (er.date_part = 'W' AND dayofweek('2012-02-12') = dayofweek(e.event_date)) 
                OR (er.date_part = 'M' AND dayofmonth('2012-02-12') = dayofmonth(e.event_date)) 
                OR (er.date_part = 'Y' AND (day('2012-02-12') = day(e.event_date) AND MONTH('2012-02-12') = MONTH(e.event_date)))
            ) 
        ) 
    )
)
ORDER BY e.event_time

那里没有那么多的and和OR。我想你在找这样的东西:

select * from tblEvent e
join tblEventRecurring er on e.id = er.event_id
where e.date = curdate() and curdate() < er.end_date and (
    (er.date_part = 'D') or
    (er.date_part = 'W' and dayofweek(curdate()) = dayofweek(e.date)) or
    (er.date_part = 'M' and dayofmonth(curdate()) = dayofmonth(e.date))
)

无论如何。。。curdate不应该是这与Mosty的答案基本相同,但是使用左连接来检索只发生一次的事件。这将检索今天的所有事件

SELECT *
FROM `tblEvent`
LEFT JOIN `tblEventRecurring`
    ON `tblEvent`.`id` = `tblEventRecurring`.`event_id`
WHERE (`tblEvent`.`date` = CURRENT_DATE AND `tblEventRecurring`.`event_id` IS NULL)
OR (
    CURRENT_DATE BETWEEN `tblEvent`.`date` AND `tblEventRecurring`.`end_date`
    AND (
        (`tblEventRecurring`.`date_part` = 'D') OR
        (`tblEventRecurring`.`date_part` = 'W' AND DAYOFWEEK(`tblEvent`.`date`) = DAYOFWEEK(CURRENT_DATE)) OR
        (`tblEventRecurring`.`date_part` = 'M' AND DAYOFMONTH(`tblEvent`.`date`) = DAYOFMONTH(CURRENT_DATE))
    )
)
我不确定这对你是否有任何用处,但我想我会像现在一样发布它

SELECT *
FROM `date_list`
LEFT JOIN (
    SELECT `tblEvent`.`id`, `tblEvent`.`date`, `tblEvent`.`name`, `tblEventRecurring`.`date_part`, `tblEventRecurring`.`end_date`
    FROM `tblEvent`
    LEFT JOIN `tblEventRecurring`
        ON `tblEvent`.`id` = `tblEventRecurring`.`event_id`
) AS `events`
    ON (
        `events`.`date` = `date_list`.`date`
    )
    OR (
        `date_list`.`date` BETWEEN `events`.`date` AND `events`.`end_date`
        AND (
            (`events`.`date_part` = 'D') OR
            (`events`.`date_part` = 'W' AND DAYOFWEEK(`events`.`date`) = DAYOFWEEK(`date_list`.`date`)) OR
            (`events`.`date_part` = 'M' AND DAYOFMONTH(`events`.`date`) = DAYOFMONTH(`date_list`.`date`))
        )
    )
WHERE `date_list`.`date` BETWEEN '2012-02-06' AND '2012-02-12'
ORDER BY `date_list`.`date`;

它假设一个日期列表表由一个日期字段组成,其中包含一个连续的日期列表。

Hmm,您要求的是一个具有这些条件的查询。所以,我不知道如何改进它。告诉我们你的预期结果应该是什么。例如:您想知道今天应该触发哪些事件吗?是的。很抱歉对于当前日期,我希望为该日期设置所有事件,以及日期部分与第二次否决投票的任何解释相匹配的任何重复事件?是的。也许应该。curdate是否比CURRENT_DATE更适合使用?或者它们是相同的,只是语法不同?文档中说CURRENT_DATE和CURRENT_DATE是curdate的同义词。我的想法是:CURDATE更短:酷。谢谢我对自己总是这样做感到内疚,我想: