SQLite 按日期排序1530019888000

Posted

技术标签:

【中文标题】SQLite 按日期排序1530019888000【英文标题】:SQLite Order By Date1530019888000 【发布时间】:2012-12-14 23:57:21 【问题描述】:

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

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

【问题讨论】:

您应该以毫秒为单位存储日期,并在每次需要显示时进行转换。这将使排序等时更容易。 【参考方案1】:

你可以这样做

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

【讨论】:

请注意,如果您想按日期和时间订购,您需要使用datetime()而不是date() 如果日期字符串的格式为“dd-mm-yyyy”怎么办?因为这个你的答案不起作用 这个回答让我很困惑。对我来说,不需要在日期字段名称周围使用“日期”或“日期时间”功能。检查 Nabi K.A.Z.回答【参考方案2】:

对我来说,我通过这种方式查询来解决我的问题

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

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

【讨论】:

另外,date() 函数以这种格式返回日期:YYYY-MM-DD。 time() 函数以 HH:MM:SS 形式返回时间。 datetime() 函数返回“YYYY-MM-DD HH:MM:SS”。 你的回答与上一个有什么不同?@Ahmad Baraka 是的。这是有效的。谢谢。我将日期设置为格式 yyyy-MM-dd HH:mm:ss 和 datetime(datetimeColumn) LIMIT 1 是做什么的?【参考方案3】:

当您确定文本字段的格式为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)【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

您可以将您的列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

【讨论】:

【参考方案6】:

在我的情况下,一切正常没有 铸造列输入“日期”。只需用 double 引号指定列名,如下所示:

SELECT * FROM 'Repair' ORDER BY "Date" DESC;

我认为 SQLite 可以自己进行投射或类似的事情,但是当我尝试自己“投射”日期列时,它不起作用。并且没有错误消息。

【讨论】:

如果我认为 Sqlite 使用添加单元格数据的日期/时间,这不起作用,当我更改一个单元格 Dat 列时,它仍然在像这样 i.ibb.co/Qv1zKQC/sqlitedatetime.png 的新日期之后对其进行排序跨度> 【参考方案7】:

您也可以使用以下查询

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

【讨论】:

【参考方案8】:

如果您进行大量日期排序/比较,您可以通过将时间存储为刻度而不是字符串来获得更好的结果,这里展示了如何在刻度中获取“现在”:

((strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000)

(见https://***.com/a/20478329/460084)

然后很容易排序,比较等......

【讨论】:

1) OP 具​​有 SARGable 值,因此无需进行转换。 2)您正在转换 NOW 而不是存储值,所以这并不是很有帮助...... 3)似乎有更好的转换(如接受的答案),不需要手动转换。你的答案比其他答案有什么好处? 1) SARG ?不知道那是什么.. 2)“现在”只是一个例子,更新了我的答案,3)接受的答案将在每次比较之前将字符串转换为 int,这是非常低效的,我认为不适用于排序索引【参考方案9】:

这适用于日期和时间

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

【讨论】:

【参考方案10】:

我发现这个丑陋的 hack 有效。

select *, substr(date_col_name,7,4)as yy, substr(date_col_name,4,2) 作为毫米, substr(date_col_name,1,2) 作为 dd 来自 my_table 按 yy desc,mm desc,dd desc 排序

最好将文本列转换为日期字段类型,但我发现这对我来说并不可靠。

【讨论】:

以上是关于SQLite 按日期排序1530019888000的主要内容,如果未能解决你的问题,请参考以下文章

从sqlite按日期升序对列表进行排序

按日期排序 - 领域(Android)

sqlite-按日期分组,根据日期查询详细内容

SQLite 按选定日期范围内的所有日期分组,即使数据不存在

在 SQLite 中按计数排序单行数组

SQLite 3:按记录排序时的字符问题