我有一张桌子,上面有一列时间,例如
| time|
|=====|
| 9:20|
|14:33|
| 7:35|
在我的查询中,我有ORDER BY time
,但它将时间排序为字符串,因此结果排序为
|14:33|
| 7:35|
| 9:20|
我必须对我的 ORDER BY 语句做什么才能使结果按时间排序,这样会导致
| 7:35|
| 9:20|
|14:33|
我有一张桌子,上面有一列时间,例如
| time|
|=====|
| 9:20|
|14:33|
| 7:35|
在我的查询中,我有ORDER BY time
,但它将时间排序为字符串,因此结果排序为
|14:33|
| 7:35|
| 9:20|
我必须对我的 ORDER BY 语句做什么才能使结果按时间排序,这样会导致
| 7:35|
| 9:20|
|14:33|
最好的方法是将时间存储为秒。可以是 unix 时间戳(推荐),也可以是自午夜以来的秒数。
在第二种情况下,7:35 将 7*3600+35*60=27300 表示 14:33 将 52380 将它们存储为整数(时间戳)。同样对于 unix 时间戳,时间存储为自 1970 年以来的秒数。
您现在可以将它们排序为整数
使用实用方法轻松处理转换
一种解决方案是在查询本身中用 1 填充不包括前导 0 的时间,然后执行排序。
SELECT * FROM <table> ORDER BY SUBSTR('0' || time, -5, 5);
以下是 SUBSTR 方法正在做什么的细分。
||
是 SQLite 中的字符串连接操作。所以'0' || '7:35'
会给予'07:35'
,'0' || '14:23'
也会给予'014:23'
。由于我们只对类似 的字符串感兴趣HH:MM
,因此我们只需要此连接字符串的最后 5 个字符。
如果您将原始字符串以前导 0 存储小时和分钟,那么您可以简单地按时间列排序并获得所需的结果。
|14:33|
|07:35|
|09:20|
这也将使使用时间列作为实际时间单位变得容易,并且可以轻松地对其进行计算。例如,如果您想在所有时间上增加 20 分钟,可以通过以下方式简单地实现:
SELECT TIME(time, '+20 minutes') FROM <table>;
这个 0 填充的原因是因为 SQLite 目前只理解 24 小时时间,例如'HH:MM'
but not 'H:MM'
。
这是有关日期和时间相关函数的 SQLite 文档的一个很好的参考页面。