SQLite返回错误的2013周数?

q9rjltbz  于 2023-04-21  发布在  SQLite
关注(0)|答案(3)|浏览(105)

我有一个简单的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的一个bug?

l3zydbqr

l3zydbqr1#

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周。*”

hof1towb

hof1towb2#

要从SQLite的无文档的周定义(第一周是包含一年中的第一个星期一的周,或者包含1月7日的周)转换到ISO周定义(第一周是包含一年中的第一个星期二的周,或者包含1月4日的周),我们让SQLite计算一年中的1月4日的周。如果不是1,我们必须增加周数:

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

lvjbypge3#

基于srdan的回答,这是一个完整的解决方案,其中包括与确定的周数相对应的年份。此表达式产生有效的ISO 8601周规范,并且可以在基于完整连续周的统计查询中按原样使用(没有围绕新年份的奇怪拆分行为)。

select format('%04d', strftime('%Y', date(_time_, '-3 days', 'weekday 4'))) || '-W' ||
    format('%02d', (strftime('%j', date(_time_, '-3 days', 'weekday 4')) - 1) / 7 + 1);
  • 2020-01-01示例:2020-W01
  • 2020-12-31示例:2020-W53
  • 2021-01-01示例:2020-W53
  • 2021-12-31示例:2021-W52
  • 2022-01-01示例:2021-W52
  • 2022-12-31示例:2022-W52
  • 2023-01-01示例:2022-W52
  • 2023-12-31示例:2023-W52
  • 2024-01-01示例:2024-W01
  • 2024-12-31示例:2025-W01

PS:如果你得到的错误是format函数没有被定义,用旧的别名printf替换它。我找不到它在哪个SQLite版本中被更改。

相关问题