按未格式化日期sqlite排序



我将日期作为字符串存储在数据库中,格式为DD-MM-YYYY。

当我试图在日期列上使用顺序进行选择查询时。我没有得到预期的结果。

结果示例:28/02/201327/02/201301/03/2013

My sql query:

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

谢谢。

问题是您将日期存储为DD-MM-YYYY字符串,这不仅会阻止日期作为字符串的自然排序,而且还会使用SQLite的日期和时间函数解析它们。点击链接并向下滚动到"时间字符串"部分。

SQLite期望日期/时间字符串按自然顺序排列,从最高有效位数到最低有效位数,即YYYY-MM-DD。您可以使用字符串操作将DD-MM-YYYY字符串转换为该形式。例如:

select 
  substr(reversed_date, 7,4) || '-' || 
  substr(reversed_date, 4, 2)|| '-' ||
  substr(reversed_date, 1, 2) as proper_date
  from (
    select '12-03-2000' as reversed_date
  )
;

您可以将日期列转换为这种格式(如@peterm所建议的),或者仅使用proper_date的值进行排序。您不需要为此使用strftime,但是与日期相关的函数将使用这些值。

你需要改变你存储日期的格式

DD-MM-YYYY

YYYY-MM-DD
从文档

时间字符串时间字符串可以是以下任意一种格式:
YYYY-MM-DD
YYYY-MM-DD HH: MM
YYYY-MM-DD HH: MM: SS
YYYY-MM-DD HH: MM: SS。SSS
YYYY-MM-DDTHH: MM
YYYY-MM-DDTHH: MM: SS
YYYY-MM-DDTHH: MM: SS。SSS

那么您的原始查询和此查询将按预期工作

SELECT * FROM Table1 ORDER BY date(date_column);
SELECT * FROM Table1 ORDER BY strftime('%s', date_column);
输出:

| date_column |
---------------
|  2013-02-27 |
|  2013-02-28 |
|  2013-03-01 |

sqlfiddle

根据文档,以下内容应该可以工作

SELECT * 
FROM data 
ORDER BY strftime('%Y-%m-%d', date_column)

try:

SELECT * FROM data ORDER BY to_date(date_column)

可能这可以解决你的问题,因为它要进行字符串比较而不是日期比较,所以

01/03/2013小于28/02/2013或27/02/2013

则输出为:

2013年3月1日、2013年2月27日、2013年2月28日

这个查询对我的过滤器日期有效

SELECT inst.*,
       Substr(columnname, 4, 2)  AS newdate,
       Substr(columnname, 0, 3)  AS newday,
       Substr(columnname, 12, 5) AS newtime
FROM   table_name AS inst
WHERE  child_id = id
ORDER  BY newdate DESC, newday DESC, newtime DESC  

最新更新