SQLITE ORDER BY月和周的数据,格式为“ MM / dd / yyyy”

时间:2018-12-22 07:42:19

标签: sqlite

我有一个表,该表的日期格式为sell_date列。

在此列中,以下日期的格式为“ MM / dd / yyyy”。

我想要的是选择按周和月排序的行。就像如果我从微调器中选择“ Jan month and a year”,它将显示该月-年格式的所有行。 每周我都不知道该怎么做:(

有这样的SQLite函数吗?

我已经尝试过strftime('%m',sell_date),但是没有用。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用

ORDER BY (substr(sell_date,7,4)||substr(sell_date,1,2)||substr(sell_date,4,2));

这将需要在日期和月份部分严格遵守MM / dd / yyyy(即01,02 .....)(例如,2018年1月1日无法正常工作)。

但是,最好以公认的格式之一存储日期,该格式可以进行排序,并且还可以通过内置的日期和时间功能(例如 strftime )来管理日期(这是因为日期不是经过重新整理的格式,因此strftime('%m', sell_date )对您不起作用)

您本可以使用strftime('%m',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2))而不是strftime('%m', sell_date )(同样,只有严格遵守MM / dd / yyyy)

关于每周,如果那是每周的意思,则可以使用%W来获取一年中的星期。同样,如果日期采用公认的格式,那么strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2))将返回一年中的星期。

同时应用这两种方法,您可以使用:-

ORDER BY 
    (substr(sell_date,7,4)||substr(sell_date,1,2)||substr(sell_date,4,2)),
    strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2))

SQL As Understood By SQLite - Date And Time Functions

示例

请考虑以下内容,它将产生两个结果。首先选择所有行(3插入日期分别为10/14/2018(第41周),09/12/2018(第37周)和11/13/2018(第46周)的顺序(按月然后按周) )。

对于插图,将生成显示一年中的月份和星期的列。在第二个查询中,还使用了“星期”列来选择与一周(第37周,又称为09/12/2018)匹配的行:-

DROP TABLE IF EXISTS table1;
CREATE TABLE IF NOT EXISTS table1 (sell_date TEXT);
INSERT INTO table1 VALUES ('10/14/2018'),('09/12/2018'),('11/13/2018');

SELECT *, 
    strftime('%m',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2)) AS month,
    strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2)) AS week
FROM table1 
ORDER BY 
    (substr(sell_date,7,4)||substr(sell_date,1,2)||substr(sell_date,4,2)),
    strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2))
;

SELECT *, 
    strftime('%m',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2)) AS month,
    strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2)) AS week
FROM table1 
WHERE CAST(week AS INTEGER) = 37
ORDER BY 
    (substr(sell_date,7,4)||substr(sell_date,1,2)||substr(sell_date,4,2)),
    strftime('%W',substr(sell_date,7,4)||'-'||substr(sell_date,1,2)||'-'||substr(sell_date,4,2))

第一个查询结果为:-

enter image description here

第二个具有WHERE子句(将值传递到INTEGER),该子句根据一年中的特定星期选择行,结果为:-

enter image description here

现在,如果日期以公认的格式(YYYY-MM-DD)存储,则上面的内容会更简单:-

DROP TABLE IF EXISTS table2;
CREATE TABLE IF NOT EXISTS table2 (sell_date TEXT);
INSERT INTO table2 VALUES ('2018-10-14'),('2018-09-12'),('2018-11-13');

SELECT *, strftime('%m',sell_date), strftime('%W',sell_date)
FROM table2 
ORDER BY sell_date, strftime('%W',sell_date)
;

SELECT *, strftime('%m',sell_date), strftime('%W',sell_date)
FROM table2 
WHERE CAST(strftime('%W',sell_date) AS INTEGER) = 37
ORDER BY sell_date, strftime('%W',sell_date)**strong text**