在我的页面中,我根据用户选择联系的所选时间范围显示一些条目,并将其保存到mySQL中。
我有4个范围组(我们的工作时间09:00-17:00),用户可以从中选择
09:00-11:00
11:00-13:00
13:00-15:00
15:00-17:00
现在,我按以下方式显示结果,按所选时间
排序$sql = "SELECT * FROM table order by chosenTime asc";
我想要做的是根据当前时间对结果进行排序。
例如,如果时间是10:30,则首先显示所选时间在09:00-11:00之间的行。 如果是11:00,则首先显示11:00 - 13:00结果。
我正在考虑between
,但我不知道如何继续这样做。
感谢任何帮助
答案 0 :(得分:0)
我想到的第一种方法是制作子表,其中时间是否在值之间。像
这样的东西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和ENDTIME相关。
答案 1 :(得分:0)
假设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
你绝对可以使用BETWEEN比较器,但请注意,在边界上,当当前时间在边缘时(例如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
请注意,第一个表达式被计算为布尔值,并将返回0
(true),NULL
(false)或DESC
(未知)。我们添加{{1}}关键字,以便在false之前对真实条件(作为值1返回)进行排序。
这不是我们用于处理时间值的正常模式,但这将适用于固定和规范格式的selectedTime。 (这适用于24小时制,但不能用12小时制或单位数小时等工作。也就是说,为了实现这一点,我们必须保证字符串比较等同于时间比较)。