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

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

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

【问题讨论】:

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

标签: sql sqlite android-sqlite sql-order-by


【解决方案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://stackoverflow.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 排序

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-22
            • 1970-01-01
            • 2013-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多