php - 选择(过滤)匹配一天、开始和结束过滤列表的记录

标签 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 且星期日 = 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。确保一天中的时间介于 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

关于php - 选择(过滤)匹配一天、开始和结束过滤列表的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827563/

相关文章:

MySql 过滤查询产品变体表

Mysql Slave 卡住了,因为 sql 和 io 显示 yes

mysql - 在 MySQL 中使用连接查询链接表

连接行上的mysql GROUP_CONCAT DISTINCT

sql - 给定一个日期,如何获取数据库中的下一个和上一个日期

javascript - 在 css 和 html 中响应左右图像

php - 从 FLV 视频中获取随机帧并将其存储为 png 或 jpg

php - cURL 请求 Spotify API 意外状态 : 415

php - 在 RegEx (PCRE) 中的上一场比赛结束时继续

mysql - SQL 按列和列值分组?