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的主要内容,如果未能解决你的问题,请参考以下文章