我有一个简单的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?
3条答案
按热度按时间l3zydbqr1#
CL的答案适用于OP对“正确”的定义,这与ISO的定义不太一样。ISO周数总是在1-53的范围内(没有第0周),而一年的最后3天可能会落在下一年的第1周,就像前3天可能会落在前一年的第52周或第53周一样,要考虑到这些边角情况你需要做一些类似的事情:
作为旁注,SQLite's Date and Time文档确实链接到POSIX strftime手册页,该手册页将
%W
修饰符定义为:“* 一年中的周数(星期一是一周的第一天),十进制数[00,53]。新一年中第一个星期一之前的所有日子都被认为是第0周。*”hof1towb2#
要从SQLite的无文档的周定义(第一周是包含一年中的第一个星期一的周,或者包含1月7日的周)转换到ISO周定义(第一周是包含一年中的第一个星期二的周,或者包含1月4日的周),我们让SQLite计算一年中的1月4日的周。如果不是1,我们必须增加周数:
lvjbypge3#
基于srdan的回答,这是一个完整的解决方案,其中包括与确定的周数相对应的年份。此表达式产生有效的ISO 8601周规范,并且可以在基于完整连续周的统计查询中按原样使用(没有围绕新年份的奇怪拆分行为)。
PS:如果你得到的错误是
format
函数没有被定义,用旧的别名printf
替换它。我找不到它在哪个SQLite版本中被更改。