检查时间是否在MySQL的时间范围内

时间:2018-06-05 16:11:30

标签: mysql

我知道这可以在后端完成 - 但我想知道是否有任何原生的或有效的MySQL函数可用于检查给定的time变量是否在两个time覆盖的范围内{1}}变量(start_timeend_time)。

我目前设置了一个数据库,如下所示;

+----+--------+------------+----------+
| id | job_id | start_time | end_time |
+----+--------+------------+----------+
|  1 |     40 | 13:00:00   | 14:00:00 |
|  2 |     44 | 14:45:00   | 15:00:00 |
|  3 |     45 | 15:10:00   | 15:30:00 |
+----+--------+------------+----------+

后端接受start_timeend_time job_id - 然后它会查看它是否适合任何地方。因此,例如,如果start_time为13:30:00,end_time为13:45:00,则后端应拒绝此作业请求,因为没有时间可用(它将与{{1处的条目重叠) }}。)

但是,如果提交的作业的开始时间为id 1,结束时间为14:10:00,则应接受该作业,因为这与任何现有任务都不重叠。

以下查询非常适合判断作业是否可以提交,例如,13:00:00至14:00:00(与id 1完全相同);

14:20:00

但是如果start_time变为13:01:00,则查询会下降 - 因为start_time小于13:01:00,时间为13:00:00。因此,它将被批准插入,因为上述查询将不会返回重叠结果。

如果我们将查询更改为SELECT * WHERE start_time >= '13:00:00' AND end_time <= '14:00:00'; 上的OR子句,那么任何未在14:00:00之前结束的作业都将被拒绝。

任何人都可以提出一种简单的方法来获取end_time类型的输入变量,并检查它是否属于所有可用timestart_time变量的范围,如db以上?

2 个答案:

答案 0 :(得分:0)

假设您的新工作开始时为new_startnew_end结束。假设您现有的列表按每个作业条目的时间顺序排列,并且它们都不重叠。

您需要检查以查看新作业是否适合列表而不重叠:

  • new_end小于第一个列表条目的start_time 在哪种情况下新条目适合开头,或者
  • new_start是 大于最后一个列表条目的end_time,在这种情况下 新条目最后适用,或者
  • 对于某些中间列表条目, new_start大于end_timenew_end小于 以下列表条目的start_time,在这种情况下是新的 条目适合此条目和下一条目。

答案 1 :(得分:-1)

我建议您通过以下方式之一办理登机手续:小时/分钟/秒

toReturn = ""
for definition in definitionArray:
    lastFunctionalLabel = ""
    toPrint = ""
    for dtTag in definition.findall("dt"):

        if dtTag.tail == "obsolete":
            dtTag.tail = "" #take away the tail word so that when printing it does not show up.
            if IGNORE_ARCHAIC:
                continue


        # We don't really care for 'verbal illustrations' or 'usage notes', even though they are occasionally useful.
        for usageNote in dtTag.findall("un"):
            dtTag.remove(usageNote)
        for verbalIllustration in dtTag.findall("vi"):
            dtTag.remove(verbalIllustration)

        # Directional cross reference doesn't make sense for us
        for dxTag in dtTag.findall("dx"):
            for dxtTag in dxTag.findall("dxt"):
                for dxnTag in dxtTag.findall("dxn"):
                    dxtTag.remove(dxnTag)

        toPrint = ET.tostring(dtTag, "", "xml").strip() # extract raw XML from <dt>...</dt>
        toPrint = toPrint.replace("<sx>", "; ") # attempt to remove 'synonymous cross reference tag' and replace with semicolon
        toPrint = toPrint.replace("<dx>", "; ") # attempt to remove 'Directional cross reference tag' and replace with semicolon
        toPrint = re.sub('<[^>]*>', '', toPrint) # remove all other XML tags
        toPrint = re.sub(':', '', toPrint) # remove all colons, since they are usually useless and have been replaced with semicolons above
        toPrint = toPrint.replace(" ; ", "; ").strip() # erase space between semicolon and previous word, if exists, and strip any extraneous whitespace
        toPrint += "<br>\n"

或使用BETWEEN功能

SELECT *  FROM timetableTemp 
WHERE HOUR(TIMEDIFF(start_time, end_time))>=1 
AND start_time >=start_time

支持:

SELECT *  FROM timetableTemp 
WHERE '13:00:00' BETWEEN start_time AND end_time