我有一个表,该表的日期格式为sell_date列。
在此列中,以下日期的格式为“ MM / dd / yyyy”。
我想要的是选择按周和月排序的行。就像如果我从微调器中选择“ Jan month and a year”,它将显示该月-年格式的所有行。 每周我都不知道该怎么做:(
有这样的SQLite函数吗?
我已经尝试过strftime('%m',sell_date),但是没有用。
谢谢。
答案 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))
第一个查询结果为:-
第二个具有WHERE子句(将值传递到INTEGER),该子句根据一年中的特定星期选择行,结果为:-
现在,如果日期以公认的格式(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**