SQLite按日期排序1530019888000

80

我的SQLite数据库中的每条记录都包含一个字段,其中包含以'yyyy-MM-dd HH:mm:ss'格式存储为stringDate

请问是否可以查询数据库以获取包含最近日期的记录?


8
你应该将日期存储为毫秒,并在需要显示时进行转换。这样做将使排序等操作更加容易。 - Andrei
10个回答

163

你可以像这样做

SELECT * FROM Table ORDER BY date(dateColumn) DESC Limit 1

65
请注意,如果您想按日期和时间排序,需要使用datetime()而不是date() - eliocs
4
如果日期字符串的格式为"dd-mm-yyyy",那么您提供的答案可能不适用。请问有什么解决方法吗? - TejpalBh
1
这个回答让我感到困惑。对于我来说,在日期字段名称周围不需要使用“date”或“datetime”函数。请检查Nabi K.A.Z.的答案。 - user1105951

48

对我来说,我是这样查询解决我的问题的。

select *  from Table order  by datetime(datetimeColumn) DESC LIMIT 1

因为我将其存储为日期时间而不是日期列


3
另外,date() 函数以 YYYY-MM-DD 格式返回日期。time() 函数以 HH:MM:SS 格式返回时间。datetime() 函数以 "YYYY-MM-DD HH:MM:SS" 格式返回日期和时间。 - wangqi060934
你的回答与之前的有何不同?@Ahmad Baraka - Gowtham Subramaniam
是的,这个可以工作。谢谢。我将我的日期设置为格式yyyy-MM-dd HH:mm:ss并使用datetime(datetimeColumn)函数。 - Rakshitha Muranga Rodrigo
LIMIT 1是什么意思? - MML

12

当你确认文本字段的格式为yyyy-MM-dd HH:mm:ss(例如:2017-01-02 16:02:55)时,仅需执行以下命令即可:

SELECT * FROM Table ORDER BY dateColumn DESC Limit 1

无需使用任何额外的日期函数!


是的,这个可以工作。谢谢。我将我的日期设置为格式yyyy-MM-dd HH:mm:ss并使用datetime(datetimeColumn)函数。 - Rakshitha Muranga Rodrigo

6

您需要将其转换为Unix时间戳,然后进行比较:

SELECT * FROM data ORDER BY strftime('%s', date_column) DESC

但是如果有很多行,这种方式可能非常慢。 更好的方法是默认存储Unix时间戳,并为该列创建索引。


4
您可以将列sent_date_time转换为yyyy-MM-dd格式,然后按日期排序:
1) substr(sent_date_time,7,4)||"-"||substr(sent_date_time,1,2)||"-"||substr(sent_date_time,4,2) as date
2) order by date desc

2
在我的情况下,如果不将列强制转换为“date”类型,一切都能正常工作。只需使用双引号指定列名即可,如下所示:
SELECT * FROM 'Repair' ORDER BY "Date" DESC;

我认为SQLite会自己进行类型转换,但当我尝试手动 'cast' 日期列时却不起作用,也没有出现错误消息。


这个似乎不起作用,如果我认为Sqlite使用单元格数据添加的日期/时间,当我更改一个单元格“Dat”列时,它仍然按照更新的日期排序,就像这样 https://i.ibb.co/Qv1zKQC/sqlitedatetime.png - Salem

1
我发现这个丑陋的方法可行。
从我的表中选择*,将date_col_name的第7到10个字符作为yy, 将date_col_name的第4和5个字符作为mm, 将date_col_name的第1和2个字符作为dd, 按照yy、mm、dd的顺序进行排序。
最好将文本列转换为日期字段类型,但我发现这对我来说并不可靠。

1
这是唯一对我起作用的解决方案,哈哈 ;) - Raghul Thangavel

1

你也可以使用以下查询

"SELECT * FROM Table ORDER BY strftime('%Y-%m-%d %H:%M:%S'," + dateColumn + ") DESC  Limit 1"

0
如果您需要进行大量的日期排序/比较,使用滴答数(ticks)而不是字符串存储时间可能会获得更好的结果。以下是如何获取当前时间的滴答数示例代码:
((strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000)

(请参见https://dev59.com/km025IYBdhLWcg3whWZm#20478329

然后就可以轻松地进行排序、比较等操作了。


  1. OP具有SARGable值,因此不需要进行转换。
  2. 您正在转换“NOW”而不是存储的值,因此这并没有太大帮助...
  3. 似乎有更好的转换方法(如被接受的答案),可以避免手动转换的需要。您的答案相比其他答案提供了什么优势?
- Clockwork-Muse
  1. SARG?不确定是什么..
  2. “现在”只是一个例子,我更新了我的答案,
  3. 接受的答案将在每次比较之前将字符串转换为整数,这非常低效,我认为对于排序索引也不起作用。
- kofifus

0

这个方法适用于日期和时间

SELECT * 
FROM Table 
ORDER BY 
julianday(dateColumn) 
DESC Limit 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接