Как сгруппировать по номеру недели и получить дату начала и дату окончания для номера недели в Sqlite? - PullRequest
3 голосов
/ 17 февраля 2012

Я хочу сгруппировать результат по номеру недели и получить дату начала и дату окончания недели. Я понятия не имел, как сделать этот sqlite. Может ли кто-нибудь помочь мне в этом.

Я также действительно запутал способ работы sqlite. Потому что, если выполнить следующий запрос, я получу номер недели как 00

SELECT strftime('%W','2012-01-01');

и неделя № 01 вместо 00 для следующего запроса

SELECT strftime('%W','2012-01-02');

Может кто-нибудь объяснить, почему sqlite ведет себя так.

Ответы [ 6 ]

7 голосов
/ 17 февраля 2012

Попробуйте:

select * from t1;

+------------+
|   ADate    |
+------------+
| 2012-01-04 |
| 2012-01-10 |
| 2012-01-19 |
| 2012-01-22 |
| 2012-01-01 |
| 2012-01-01 |
+------------+

select 
    strftime('%W', aDate) WeekNumber,
    max(date(aDate, 'weekday 0', '-7 day')) WeekStart,
    max(date(aDate, 'weekday 0', '-1 day')) WeekEnd,
    count(*) as GroupedValues
from t1
group by WeekNumber;

+------------+------------+------------+------------+
| WeekNumber | WeekStart  |  WeekEnd   | WeekNumber |
+------------+------------+------------+------------+
|         00 | 2011-12-25 | 2011-12-31 |          2 |
|         01 | 2012-01-01 | 2012-01-07 |          1 |
|         02 | 2012-01-08 | 2012-01-14 |          1 |
|         03 | 2012-01-15 | 2012-01-21 |          2 |
+------------+------------+------------+------------+

Если честно ... Я не знаю, почему 2012-01-01 это неделя 0, а 2012-01-02 неделя 1. Звучит очень странноособенно если неделя начинается по воскресеньям!: S

3 голосов
/ 08 июня 2012

попробуйте что-то вроде этого:

select 
    strftime('%W', aDate, 'weekday 1') WeekNumber,
    max(date(aDate, 'weekday 1')) WeekStart,
    max(date(aDate, 'weekday 1', '+6 day')) WeekEnd,
    count(*) as GroupedValues
from t1
group by WeekNumber;
1 голос
/ 05 сентября 2012

Я очень поздно знаю на вечеринке, но могу объяснить почему.Используемая ссылка на Strftime взята из C. Способ вычисления C разочаровывает.

Дни идут с 0 до 6, 0 - воскресенье, 6 - суббота.

Однако недели начинаются с понедельника.до воскресенья.

Из документации C:

%w  Weekday as a decimal number with Sunday as 0 (0-6)
%W  Week number with the first Monday as the first day of week one (00-53)

Таким образом, неделя 00 будет воскресеньем до первого понедельника года.Если год начался в четверг, все дни до понедельника были бы неделей 00. Не уверен, что такое стандарт ISO, я думаю, что первый четверг года - неделя 1.

Мне потребовалось некоторое времячтобы решить эту проблему, я должен был учитывать недели, продолжающиеся с четверга по среду.

0 голосов
/ 23 апреля 2019

Принятый ответ может быть немного упрощен и обеспечивает большую гибкость. Обратите внимание, что this_sunday включает сам день, если это воскресенье.

SELECT
   DATE(created_at, 'weekday 0') AS this_sunday,
   COUNT(*) AS rows_this_week
FROM my_table
GROUP BY this_sunday;

Этот метод проще, чем strftime('%W', created_at), и он более мощный. Например, если вы хотите объединить недели, заканчивающиеся в понедельник:

SELECT
   DATE(created_at, 'weekday 1') AS this_monday,
   COUNT(*) AS rows_this_week
FROM my_table
GROUP BY this_monday;

Это работает благодаря модификатору 'weekday N', который перемещает дату на указанный день недели, если она в будущем, или сохраняет ее, если это тот же день.

Наконец, чтобы проверить, какие даты включены в диапазон вашей недели, я рекомендую этот метод:

SELECT
   DATE(created_at, 'weekday 1') AS this_monday,
   MIN(DATE(created_at)) AS earliest,
   MAX(DATE(created_at)) AS latest,
   COUNT(*) AS rows_this_week
FROM my_table
GROUP BY this_monday;
0 голосов
/ 26 июля 2014

Если указанная дата является первой в неделе, то DATE('2014-07-20', 'weekday 0', '-7 days') вернет '2014-07-13', что на 7 дней раньше, чем требуется.

Это лучшее, что я пришелдо сих пор:

CASE DATE(myDate, 'weekday 0')
  WHEN DATE(myDate) THEN DATE(myDate)
  ELSE DATE(myDate, 'weekday 0', '-7 days')
END
0 голосов
/ 17 февраля 2012

в соответствии с документацией по SQL Lite. Воскресенье == 0, а 2012-01-01 - воскресенье, поэтому его выплевание 00;

. Здесь можно посмотреть функции даты и времени для sqllite

http://www.sqlite.org/lang_datefunc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...