选择(过滤)与日期,开始和结束过滤器列表匹配的记录

时间:2014-11-09 11:14:06

标签: php mysql sql date mysqli

我实际上想要将我的日期结果与另一个列表相匹配。此过滤器列表具有(可以)多个星期几,开始时间和结束时间的记录。所以这应该有助于仅选择与这些时间和日期匹配的结果。但正如我所提到的,这些可能是多次,只有一个记录。我需要一种快速有效的方法来做到这一点,因为日期会非常拥挤。 我的另外一个问题是我应该用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 个答案:

答案 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。确保当天的时间介于timeStarttimeEnd

之间

这更简单,只需要使用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