日期部分的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和# 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更短:酷。谢谢我对自己总是这样做感到内疚,我想: