没有格式化日期sqlite的顺序

时间:2013-03-05 21:10:02

标签: sql sqlite date format

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

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

结果示例: 28/02/2013 27/02/2013 2013年1月3日

我的SQL查询:

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

谢谢。

5 个答案:

答案 0 :(得分:6)

问题是您将日期存储为DD-MM-YYYY字符串,这不仅会阻止日期自然排序为字符串,还会使用SQLite's date and time functions解析日期。单击链接并向下滚动到“时间字符串”部分。

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,但与日期相关的函数将使用此类值。

答案 1 :(得分:4)

恕我直言,您需要更改存储日期的格式

DD-MM-YYYY

YYYY-MM-DD

来自docs

  

时间字符串   时间字符串可以采用以下任何格式:
  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

答案 2 :(得分:2)

根据documentation,以下内容应该有效

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

答案 3 :(得分:1)

尝试:

SELECT * FROM data ORDER BY to_date(date_column)

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

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

因此输出是:

01/03 / 2013,27 / 02 / 2013,28 / 02/2013

答案 4 :(得分:0)

此查询对我有用过滤日期

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