我有一个表格,其中包含一些时间段,例如
| time|
|=====|
| 9:20|
|14:33|
| 7:35|
在我的查询中,我有ORDER BY time
,但它将时间排序为字符串,因此结果按
|14:33|
| 7:35|
| 9:20|
我需要对ORDER BY语句做什么才能将结果按时间排序,以便导致
| 7:35|
| 9:20|
|14:33|
答案 0 :(得分:2)
最好的方法是将时间存储为秒。可以是unix时间戳(推荐),也可以是午夜以来的秒数。
在第二种情况下,7:35将是7 * 3600 + 35 * 60 = 27300,14:33的表示将是52380将它们存储为整数(时间戳)。类似地,对于unix时间戳,自1970年以来,时间被存储为无秒数。
您现在可以将它们整理为整数
使用实用程序方法轻松处理转换
答案 1 :(得分:2)
一种解决方案是在查询本身填充不包含前导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'
但不是'H:MM'
。
这是关于Date and Time related functions的SQLite文档的一个很好的参考页面。