SQLITE ПОРЯДОК ПО МЕСЯЦАМ И НЕДЕЛЯМ В формате «ММ / ДД / ГГГГ» - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть таблица со столбцом с именем sell_date в формате даты.

В этом столбце у меня есть следующая дата в этом формате «ММ / дд / гггг».

Что яхочу выбрать строки, упорядоченные по неделям и месяцам.Например, если я выберу январь месяц и год из счетчика, он покажет все строки в формате месяц-год.И еженедельно я понятия не имею, как это сделать: (

Есть ли такая функция SQLite, которая делает это ??

Я уже пробовал strftime ('% m', sell_date), но ditn 'т работы.

Спасибо.

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете использовать

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

Это потребует строгого соблюдения ММ / дд / гггг, равного 01,02 ..... как для части дня, так и для части месяца (например, 1/1 /2018 год не будет работать должным образом).

Однако гораздо лучше хранить даты в одном из распознанных форматов, который можно просто отсортировать, и дополнительно позволяет управлять датами с помощью встроенных функций даты и времени, таких каккак 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 ) (опять же, только если было строгое соблюдение ММ / дд / гггг)

Что касается еженедельных, вы можете использовать% 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Разбирается в SQLite - Функции даты и времени .

Пример

Рассмотрим следующее, которое дает два результата.Первый Выбор всех строк (3 вставляются с датами 10/14/2018 (неделя 41), 09/12/2018 (неделя 37) и 13.11.2008 (неделя 46) в порядке, как ожидается (по месяцам, а затем по неделям)).

Для иллюстрации создаются столбцы, которые показывают месяц и неделю года. Столбец недели также используется во втором запросе для выбора строк, которые соответствуют неделе (неделя 37 или 12.09.2008).): -

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

Теперь, если даты были сохранены враспознанный формат (ГГГГ-ММ-ДД), тогда выше будет проще: -

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**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...