我有一个包含3列的表; day_id
,start_date
,end_date
。 start_date
和end_date
是varchar(8),格式为HH:II:SS
。有时日期可能会超过24小时,以表示第二天后发生了某事,例如:25:20:01是01:20:01,但发生在新的一天。 day_id
不是唯一的,它会重复。我需要获取一天的第一件事和最后一件事情,这是我的代码:
SELECT day_id,
MIN(start_date) as start_time,
MAX(end_date) as end_date
FROM events WHERE day_id IN ('day_1', 'day_2', 'day_3')
GROUP BY day_id ORDER BY start_time ASC
它可以按预期工作,但我不知道为什么,MySQL怎么知道25:01:45
比20:21:09
大,因为它们都是varchars?整个表以utf8mb4_0900_ai_ci
归类,在MySQL服务器版本8上运行。
答案 0 :(得分:0)
MySQL如何知道25:01:45大于20:21:09?
数据库使用排序规则比较字符串。默认排序规则是字母顺序。
因此,MySQL知道'25'
> '20'
的方式与我们知道单词'BE'
在字典中的'BA'
之后的方式完全相同。
答案 1 :(得分:0)
这是一个字符串比较,它会比较字符及其字符的ascii值。但是它主要起作用是因为它同时将两位数和两位时间参数表示为两位数表示。例如-
1:20:1
表示为01:20:01
2:5:7
表示为02:05:07
因此,由于10:02:07
为{{1},所以2:5:7
永远不会出现在1
之前(因为2
<2:5:7
) }和02:05:07
> 1
。因此,它始终有效。
有时候,日期可能会超过24小时,以表示某件事 发生在第二天,例如:25:20:01是01:20:01
因此,如果此0
由于某些原因超过2位数字,那么您将遇到问题。因此,请使用正确的数据类型来存储它-25
。