在SQLite中更改排序

时间:2011-03-04 22:13:30

标签: java sql sqlite

我的日期以这种格式存储:

3-1-2011
3-15-2011

然而,它似乎正在这样排序:

3-1-2011
3-10-2011
...
3-19-2011
3-2-2011
3-20-2011
...
3-29-2011
3-3-2011
3-30-2011

因此,当我尝试使用WHERE日期介于3-1-2011和3-3-2011之间时,它似乎会返回从3-1到3-29的所有内容的结果。在不改变所有值的情况下,可以解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

您的数据不会被排序为DATE,因为您没有将它们存储为SQLite支持的格式:

  

YYYY-MM-DD HH:MM:SS.SSS

有关详细信息,请参阅data type documentation

答案 1 :(得分:3)

由于SQLite没有为存储日期指定任何含义(它们只是文本,实数或整数列,具体取决于您使用的格式),我不相信您可以轻松地对它们进行排序以你存储它们的方式。(也就是说,希望有人会证明我错了。)

因此,两种可能的解决方案是:

  1. 将日期存储为时间戳。这些将始终正确排序。

  2. 使用date and time函数即时创建时间戳列。您可以使用带有unixepoch修饰符的日期和时间函数创建别名,并基于此进行排序

  3. 我很遗憾此刻无法访问sqlite来测试这些,但我认为它们应该是合理的。 (如果没有,有人无疑会纠正我。)

答案 2 :(得分:3)

SQLite每列没有“类型”(SQLite is typeless)。这些是等价的

create table t(dt datetime)
create table t(dt int)
create table t(dt)

他们都创建了一个能够存储任何数据的列dt。

下面的案例陈述可用于将您的[m]m-[d]d-[yy]yy数据转换为实际日期,然后您可以将其更新回表格(标准化)或用于排序。

select dt, date(
case when dt like '%-%-__' then substr(dt,-2)
     when dt like '%-%-____' then substr(dt,-4) end
|| '-' ||
case when dt like '_-%' then '0' || substr(dt,1,1)
     when dt like '__-%' then substr(dt,1,2) end
|| '-' ||
case when dt like '__-_-%' then '0' || substr(dt,4,1)
      when dt like '__-__-%' then substr(dt,4,2)
      when dt like '_-_-%' then '0' || substr(dt,3,1)
      when dt like '_-__-%' then substr(dt,3,2) end)
from t
order by 2
相关问题