我想按星期分组结果并获取本周的开始日期和结束日期。我不知道如何做这个sqlite。有人可以帮我这个。
我也真的很喜欢sqlite的工作方式。因为如果运行以下查询,我会得到一周没有为00
SELECT strftime('%W','2012-01-01');
对于以下查询,和周号为01而不是00
SELECT strftime('%W','2012-01-02');
有人可以解释为什么sqlite的行为是这样的。
答案 0 :(得分:6)
试试这个:
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周。听起来很奇怪,特别是如果星期几开始! :■
答案 1 :(得分:3)
尝试这样的事情:
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;
答案 2 :(得分:1)
我对聚会非常了解,但我可以解释原因。使用的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周。
我花了一段时间来解决这个问题,因为我必须在星期四到星期三之间进行数周的讨论。
答案 3 :(得分:0)
根据SQL Lite文档星期日== 0和2012-01-01是一个星期天所以它吐出00;
在这里查看sqllite的日期时间函数
答案 4 :(得分:0)
如果给定日期是一周中的第一天,那么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
答案 5 :(得分:0)
可以稍微简化接受的答案,并提供更大的灵活性。请注意,如果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;
由于modifier '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;
答案 6 :(得分:0)
简而言之,根据https://sqlite.org/lang_datefunc.html及其与strftime函数(http://opengroup.org/onlinepubs/007908799/xsh/strftime.html的链接),sqlite定义星期一的星期(%W)。
因此,如果仍然有人需要从星期日开始对周进行分组,则只需提前一天即可:
SELECT strftime('%W','2012-01-01', '+1 day')