10

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

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

2009-2012 年是正确的。在 2013 年,我总是得到错误的周数。

例如

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

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

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

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

SQLite 日期时间函数中是否有我不理解的内容?或者它是 SQLite 的错误?

4

2 回答 2

12

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 的日期和时间文档确实链接到POSIX strftime手册页,该手册将%W修饰符定义为:“一年中的周数(星期一作为一周的第一天)作为十进制数 [00,53]。新年中第一个星期一之前的所有日子都被认为是在第 0 周。

于 2013-03-19T22:38:28.023 回答
5

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

SELECT strftime('%W', MyDate)
       + (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04'))
FROM MyTable
于 2013-02-26T08:36:29.313 回答