我实际上想过滤与另一个列表匹配的日期结果。该过滤器列表具有(可以具有)星期几、开始时间和结束时间的多个记录。因此,这应该有助于仅选择与这些时间和日期相匹配的结果。但正如我所提到的,这些可能是多次或只有一条记录。我需要一种快速有效的方法来做到这一点,因为约会会非常拥挤。 我的附加问题是我应该使用 sql 查询执行此操作还是使用 php 执行此操作会更好?
这是日期的示例。作为“Y-m-d H:i:s”标准。
dates
2014-10-31 01:20:08
2014-11-01 09:22:08
2014-11-10 09:24:08
2014-11-13 09:26:08
2014-11-14 09:28:08
这是时间和日期的示例。 (ISO-8601 1 表示星期一,7 表示星期日)
day timeStart timeEnd
0 01:00:00 05:00:00
1 01:00:00 05:00:00
2 01:00:00 05:00:00
4 01:00:00 05:00:00
7 01:00:00 05:00:00
这就是我想要的结果。仅匹配过滤器列表的日期
result
2014-10-31 01:20:08
最佳答案
我假设如果星期一 = 1 且星期日 = 7,那么 0 也一定表示星期日。
因此,要查找匹配项,您需要通过两种方式链接表格:
<强>1。查找该日期是星期几并将其与日期相匹配
您可以使用 WEEKDAY
查找星期几功能。正如文档所说,星期一是 0,星期日是 6,这超出了您的范围 1 天。而且你显然需要考虑到你可以有 0 和 7。
因此,要在 WEEKDAY
上进行匹配,您需要将 day
减去 1,然后使用 modulus %
将其标准化为 1 - 7 的范围。 。请记住,0 - 1
将返回 -1
,因此添加 7 以确保其为正数:
where WEEKDAY(d.theDate) = ((dr.day + 7) - 1) % 7
<强>2。确保一天中的时间介于 timeStart
和 timeEnd
这要简单得多,只需要使用 TIME
函数将日期转换为时间,然后检查它是否在两个时间之间:
where TIME(d.theDate) between dr.timeStart and dr.timeEnd
组合起来
将这两件事放在一起,您可以使用相当简单的连接来查找匹配项:
select d.theDate from dates as d
inner join dateRanges as dr on WEEKDAY(d.theDate) = ((dr.day + 7)-1)%7
and TIME(d.theDate) between dr.timeStart and dr.timeEnd
这里以 SQLFiddle 为例:http://sqlfiddle.com/#!2/2ad80/4
关于php - 选择(过滤)匹配一天、开始和结束过滤列表的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827563/