【问题标题】:SQL query, time spanSQL查询,时间跨度
【发布时间】:2020-10-10 02:49:44
【问题描述】:

我正在编写一个脚本,用于跟踪参加工作场所的人。我要找出谁在一段时间内去过那个地方。

它还必须找到在那段时间里已经在那里呆过一段时间的人。

还有那些在时间开始后到达并在工作日结束前离开的人。我将需要使用此 SQL 查询找到任何曾经去过那里的人。

我有以下。但它只会给我那些从开始时间($time_from) 到结束时间($time_to) 之前离开的人。

$SQL_String = mysqli_query ($con, "
    SELECT * 
      FROM log 
     WHERE users_name = '" . $username . "' 
       AND login_time >= '" . $time_from . "' 
       AND logout_time <= '" . $time_to . "' 
     ORDER 
        BY dateandtime ASC
    "); 

login_time 和logout_time 是用户在数据库中的开始和结束时间。 $time_from 和 $time_to 是表格中选择的开始和结束时间。

如果我搜索这些时间;

10:00 – 12:00

  • 应该计算拥有这些时间的成员。 9:00 – 10:05
  • 应该计算拥有这些时间的成员。 10:05 – 11:45 有这些时间的成员应该被计算在内。 11:00 – 12:05
  • 应该计算拥有这些时间的成员。 9:00 – 13:00

简而言之:

我需要找到在给定时间跨度内一直在工作的人。无论他们是整天都在那里,还是迟到,还是早退——如果他们在表格上读取的时间内到过。

你能帮我解决这个问题吗? 谢谢!

【问题讨论】:

标签: php mysql sql select where-clause


【解决方案1】:

您有 3 个案例:

  • 在给定时间范围内到达的人
  • 在给定时间范围内离开的人
  • 在时间范围之前到达,之后离开的人

现在组合成这样的:

where 
(arrival >= starttime AND arrival <= endtime) 
OR 
(departure >= starttime AND arrival <= endtime) 
OR
(arrival <= starttime AND departure >= endtime)

哦,顺便说一句:您的 sql 对 sql 注入过滤能力是开放的。切勿在 sql 字符串中直接使用变量。

【讨论】:

  • 没有。只有一种情况。
【解决方案2】:

你想要任何重叠那将是:

select l.*
from log l
where l.login_time < $time_to and
      l.logout_time > $time_from;

如果 A 在 B 结束之前开始并且 A 在 B 开始之后结束,则逻辑非常简单,时间帧 A 与时间帧 B 重叠。

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多