我有一个SQLite查询,其中我按日期排序结果。这很好用。但是,当我在SQL语句中引入“DISTINCT”时,结果不再保持有序。
有什么想法吗?
SELECT date
FROM details
ORDER BY date(date); // Results are ordered correctly
April 04, 2011
April 04, 2011
April 04, 2011
April 03, 2011
April 01, 2011
March 25, 2011
SELECT DISTINCT date
FROM details
ORDER BY date(date); // Results are out of order
April 01, 2011
April 03, 2011
April 04, 2011
March 25, 2011
答案 0 :(得分:3)
date
功能无法识别您的date()
列,因此date(date)
提供了NULL
。
尝试使用ORDER BY NULL
的两个查询,您将获得与ORDER BY date(date)
相同的结果
如果没有DISTINCT
,则按插入顺序对它们进行排序。
使用DISTINCT
,订单来自DISTINCT
本身,并应用于date
列,这是一个文本,因此按字母顺序排列。
SQLite不支持月份名称。将数据更改为支持的格式(请参阅Date And Time Functions)或将日期列转换为可识别的格式,然后再将其提供给date()
(使用字符串函数)
例如(在调用date
之前将YYYY-mmm-dd
转换为格式date()
):
(此处CASE WHEN
仅限于您的数据,您可以将其延长至所有月份)
SELECT DISTINCT date
FROM (SELECT *,
substr(date, -4) year,
substr(date, -8, 2) day,
trim(substr(date, 1, length(date)-8)) month
FROM details) as details
ORDER BY date(year
|| '-'
|| CASE WHEN month = 'April' THEN '04' ELSE '03' END
|| '-'
|| day)
,无论是否有DISTINCT
,都会给出正确的结果。
答案 1 :(得分:1)
我认为您的日期字符串不是有效的日期格式。
尝试运行此SQL以查看您获得的内容:
SELECT strftime('%Y-%m-%d', date) FROM details;
如果您收到错误,则无法正确解析您的日期。
您的第二个查询按字母顺序返回,而不是按时间顺序返回 - 如果它不是该字段中的有效日期,那就是原因。