我需要构建日期范围查询来查找事件。 一些事件每年都会重复一次(annual_natural = true),并且这会在年终/开始时导致问题。我需要知道如何存储这些日期(我年度使用什么值?)和/或改进查询。 我目前正在将重复日期存储为2017年的日期类型(如果他们跨越新的一年,则为2017年和2018年) 这是我尝试过的。它的作用不同于新的一年中发生的事件。只有相关的字段包含在这个问题中。 我很高兴重新设计数据库,我只有测试数据量小日期范围查询忽略月份年份结束和年份开始
"SELECT event.event_name, event.start_date, event.end_date, event.all_year, event.yearly_natural
FROM event
INNER JOIN event_location ON event_location.event_location_id = event.event_location_id
WHERE
(event.yearly_natural = false
AND
(event.start_date BETWEEN '$testFrom' AND '$testTo')
OR (event.end_date BETWEEN '$testFrom' AND '$testTo')
OR (event.start_date <= '$testFrom' AND event.end_date >= '$testTo')
)
OR (event.yearly_natural = true
AND
(DATE_FORMAT(event.start_date, '%m%d') BETWEEN '$testFrom' AND '$testTo')
OR (DATE_FORMAT(event.end_date, '%m%d') BETWEEN '$testFrom' AND '$testTo')
OR (DATE_FORMAT(event.start_date, '%m%d') <= '$testFrom' AND event.end_date >= '$testTo')
)
OR (event.all_year = true)
";
奇怪。我认为每年一次活动开始和结束的可能性不大,并且发生在同一地点。我会创建两个表格,一个用于事件属性,例如名称,描述等,另一个用于事件日期和位置。因此,每次事件发生时,您都会在最后一个表中创建一个新行。这样你可以继续使用'date'类型。 –
@KIKOSoftware嗨。这些事件是野生动物事件,例如季节性开花或鸟类栖息因此相同的日期和地点。已经有两个表格(event和event_location)因此加入,但为了清晰我已经忽略了位置细节。 – silverbadger
所以我的问题是:如果这些事件之一每年从十一月运行到一月份,怎么办?如何存储日期或查询它们? – silverbadger