我实际上想要将我的日期结果与另一个列表相匹配。此过滤器列表具有(可以)多个星期几,开始时间和结束时间的记录。所以这应该有助于仅选择与这些时间和日期匹配的结果。但正如我所提到的,这些可能是多次,只有一个记录。我需要一种快速有效的方法来做到这一点,因为日期会非常拥挤。 我的另外一个问题是我应该用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
答案 0 :(得分:1)
我假设如果星期一= 1且星期日= 7,则0也必须表示星期日。
因此,要查找匹配项,您需要以两种方式链接表:
<强> 1。查找该日期的星期几并将其与日期相匹配
您可以使用WEEKDAY
功能查找星期几。正如文档所说,星期一是0,星期日是6,这是你的范围的1天。此外,你显然需要考虑到你可以有0和7。
因此要匹配WEEKDAY
,您需要关闭day
,然后使用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