2012-02-17 104 views
2

我想按星期编号分组,并得到本周的开始日期和结束日期。我不知道如何做这个sqlite。有人能帮我解决这个问题吗?如何按星期分组否,并获取Sqlite中星期数的开始日期和结束日期?

我也真的混淆了sqlite的工作方式。因为如果运行下面的查询我得到的一周没有为00

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

和星期没有为01,而不是00以下查询

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

有人能解释为什么sqlite的行为就像这样。

回答

0

根据SQL Lite文档Sunday == 0和2012-01-01是星期日,所以它吐出了00;

看看日期时间函数sqllite这里

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

+0

请注意,我不是试图让周一天。其实我正在尝试获取时间戳的星期编号。 如果您运行第一个查询,您将得到00作为第一个星期的查询,01查询第二个查询,而不是00.因为两个日期都是在一月份的第一个星期,并且应该得到相同的结果。 SELECT strftime('%W','2012-01-01'); SELECT strftime('%W','2012-01-02'); 这是在sqlite的错误? – 2012-02-17 03:24:57

+0

在页面底部的http://www.sqlite.org/lang_datefunc.html中,列出了sqlite的所有错误和限制;从它的外观计算将在Windows Vista中不正确!你是否运行Vista或Windows 7? – 2012-02-17 03:46:27

5

尝试了这一点:

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周。听起来很奇怪,尤其是如果这周在周日开始! :■

+0

我们正在为web和iphone构建仪表板。 Mysql显示正确的结果,但sqlite不是。 – 2012-02-17 06:35:23

+0

正如你可以看到你的数据,2012-01-01 | 2012-01-01 | 2012-01-04一切都应该在周没有00但2012-01-04的日期下周没有01.你能解释这一点! – 2012-02-17 06:43:40

+0

正如我在答案中告诉你的,我只是不知道。我觉得它也有点矛盾。 – 2012-02-17 12:07:28

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; 
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周。

我花了一段时间来解决这是因为我必须从周四到周三进行数周的交易。

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 
相关问题