SQLite返回错误的2013年周数?

Web*_*cer 7 sqlite strftime week-number

我在SQLite的报告中有一个简单的SQL来计算周数

SELECT STRFTIME('%W', 'date_column')
Run Code Online (Sandbox Code Playgroud)

对于2009-2012非常正确.在2013年,我总是错误的周数.

例如

SELECT STRFTIME('%W', '2012-02-28')
Run Code Online (Sandbox Code Playgroud)

返回'09',这是正确的.

SELECT STRFTIME('%W', '2013-02-28')
Run Code Online (Sandbox Code Playgroud)

返回'08',这是错误的.我们有第9周.

SQLite日期时间函数中有什么我不明白的东西吗?或者它是SQLite的错误?

srd*_*dan 8

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;
Run Code Online (Sandbox Code Playgroud)

另外,SQLite的日期和时间文档确实链接到POSIX strftime手册页,它将%W修饰符定义为:" 年份的周数(星期一作为一周的第一天)作为十进制数[00,53].在第一个星期一之前的新年中的所有日子被认为是在第0周. "

  • @l33t:如果您想计算 **ISO** 周数,则“更好”。这和原始解决方案有时在一年的最后 3 天和前 3 天中的一天或多天有所不同。例如,01/01/2011 的 ISO 周数是 52,原解计算为 0。或者 12/31/2012 的 ISO 周数为 1,原解输出 53。是的,我也测试过,对于范围为 50 年,输出与 python 的 `datetime.isocalendar()` 方法的输出相同。 (2认同)

CL.*_*CL. 5

要将 SQLite 未记录的周定义(第一周是一年中第一个星期一的周,或 1 月 7 日所在的周)转换为 ISO 周定义(第一周是一年中的第一个星期二所在的周,或包含 1 月 4 日的那一周),我们让 SQLite 计算一年中的 1 月 4 日那一周。如果这不是一个,我们必须增加周数:

SELECT strftime('%W', MyDate)
       + (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04'))
FROM MyTable
Run Code Online (Sandbox Code Playgroud)