如何按周分组并获取Sqlite中周数的开始日期和结束日期?

时间:2012-02-17 03:02:59

标签: sql sqlite

我想按星期分组结果并获取本周的开始日期和结束日期。我不知道如何做这个sqlite。有人可以帮我这个。

我也真的很喜欢sqlite的工作方式。因为如果运行以下查询,我会得到一周没有为00

SELECT strftime('%W','2012-01-01');
对于以下查询,

和周号为01而不是00

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

有人可以解释为什么sqlite的行为是这样的。

7 个答案:

答案 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的日期时间函数

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

答案 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')
相关问题