在我的页面中,我根据用户选择联系的chosenTime的范围显示了一些条目,并将其保存到mySQL中。
我有4个时间范围组(我们的工作时间09:00-17:00)供用户选择
09:00-11:00
11:00-13:00
13:00-15:00
15:00-17:00现在,我将结果显示如下,按chosenTime排序
$sql = "SELECT * FROM table order by chosenTime asc";我想做的是根据当前时间对结果进行排序。
例如,如果时间是10:30,则首先显示所选时间在09:00-11:00之间的行。如果是11:00,则先显示11:00 - 13:00结果。
我正在考虑一个between,但我不知道该怎么做。
任何帮助我们都将不胜感激
发布于 2014-04-24 07:01:26
我脑海中浮现的第一个方法是制作时间介于两个值之间或不在其间的子表。就像这样
Select *
FROM
(Select *, 1 as priority FROM table where time between STARTTIME and ENDTIME) UNION
(Select *, 2 as priority FROM table where time NOT between STARTTIME and ENDTIME)
ORDER BY priority这将首先为您提供与当前STARTTIME和工作期结束时间相关的结果。
发布于 2014-04-24 07:25:53
假设chosenTime是字符类型,采用固定和规范的格式,这一点都不难。
我们需要hh:mm格式的当前时间(例如10:30)来匹配存储的格式。
如果我们想以这种格式从数据库中获取当前时间,这是一个简单的表达式:
DATE_FORMAT(NOW(),'%h:%i')最难看的部分是拆分字符串。给定一个固定格式的hh:mm-hh:mm,我们可以使用简单的SUBSTR函数:
SUBSTR(ct,1,5) -- begin
SUBSTR(ct,7,5) -- end你绝对可以使用一个介于两者之间的比较器,但请注意,在边界上,当当前时间处于边缘时(例如13:00),我们将在11:00-13:00和13:00-15:00周期上得到“匹配”。
ORDER
BY DATE_FORMAT(NOW(),'%h:%i') BETWEEN SUBSTR(ct,1,5) AND SUBSTR(ct,7,5) DESC
, ct
, ...注意,第一个表达式的计算结果是布尔值,它将返回1 (true)、0 (false)或NULL (unknown)。我们添加DESC关键字,以便true条件(返回值为1)将排在false之前。
这不是我们用来处理时间值的常规模式,但这适用于采用固定和规范格式的chosenTime。(这适用于24小时制的时钟,但不适用于12小时制或个位数小时等。也就是说,要实现这一点,我们必须保证字符串比较等同于时间比较。)
https://stackoverflow.com/questions/23256713
复制相似问题