2013-02-26 75 views
4

我对SQLite的2013年SQLite返回错误的周数?

SELECT STRFTIME('%W', 'date_column') 

这是正确的计算2009-2012我的报告中周数一个简单的SQL。在2013年,我总是得到错误的周数。

例如

SELECT STRFTIME('%W', '2012-02-28') 

回报 '09',这是正确的。

SELECT STRFTIME('%W', '2013-02-28') 

return'08',这是错误的。我们有第九周。

有什么在SQLite的日期时间函数,我不明白?或者它是SQLite的错误?

回答

6

CL的回答能正常工作的“正确”的OP的定义,这是不完全一样的ISO定义。 ISO周数总是在范围1-53(无0周),一年的过去的3天可能会落入下一年度的第1周,就像第3天可能落入第52周或53个前一年。采取这些极端情况考虑进去,你需要做的是这样的:

SELECT 
    (strftime('%j', date(MyDate, '-3 days', 'weekday 4')) - 1)/7 + 1 AS ISOWeekNumber 
FROM MyTable; 

作为一个侧面说明,SQLite's Date and Time文档中则链接到POSIX strftime手册,它%W修改定义为:的 “周号今年(星期一作为一周的第一天)作为十进制数[00,53]。在新的一年所有天的第一个星期一之前被认为是在本周0

+0

感谢您的回答。我会检查解决方案。 – WebDucer 2013-03-29 15:54:26

+0

这是否比建议的解决方案更好?测试? – l33t 2013-05-03 08:14:59

+1

@ l33t:如果您想计算** ISO **周数,则“更好”。这和原来的解决方案有时在一年中的最后3天和前3天有一次或多次不同。例如,2011年1月1日的ISO周数为52,原始解决方案将其计算为0.或2012年12月31日的ISO周为1,原始解决方案输出53。 是的,我也对它进行了测试,范围为50年,并且输出与python的'datetime.isocalendar()'方法的输出相同。 – srdan 2013-05-17 11:00:23

3

要将SQLite未公开的星期定义(第一周是其中包含年份第一个星期一的星期或具有1月7日的那一周)转换为ISO星期定义(第一周是包含年份第一个星期二或1月4日的那一周),我们让SQLite计算1月4日的一周。如果这不是一个,我们要增加周数:

SELECT strftime('%W', MyDate) 
     + (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04')) 
FROM MyTable 
+0

感谢您的帮助。有一个共同的SQL公式来获得一年的正确的周数吗? – WebDucer 2013-02-26 21:22:12

+0

定义“正确”。 – 2013-02-27 08:06:15

+0

我的意思是以下的权利。 第0周:当天属于前一年的最后一周 第1周:当天属于本年的第一周 第一周(ISO)以1月4日所属的周开始至。 例如: 2013年1月1日=>第一周, 01.01.2012 =>第52周(0),2012年2月1日 =>第一周, 01.01.2010 =>第53周(0), 04.01.2010 =>第1周 – WebDucer 2013-02-27 22:09:16