【问题标题】:SQLite return wrong week number for 2013?SQLite 为 2013 年返回错误的周数?
【发布时间】:2013-02-11 12:26:26
【问题描述】:

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

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

2009-2012 年是正确的。 2013 年我总是弄错周数。

例如

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

返回 '09' 这是正确的。

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

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

SQLite 日期时间函数中有什么我不明白的地方吗?还是 SQLite 的 bug?

【问题讨论】:

    标签: sqlite strftime week-number


    【解决方案1】:

    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 周。"

    【讨论】:

    • 感谢您的回答。我会检查解决方案。
    • 这真的比建议的解决方案更好吗?测试了吗?
    • @l33t:如果你想计算 ISO 周数,它会“更好”。这和原始解决方案有时在一年的最后 3 天和前 3 天中的一个或多个不同。例如,2011 年 1 月 1 日的 ISO 周数为 52,原始解决方案将其计算为 0。或者 2012 年 12 月 31 日的 ISO 周数为 1,原始解决方案输出 53。是的,我也对其进行了测试,因为范围为 50 年,输出与 python 的 datetime.isocalendar() 方法的输出相同。
    • 非常感谢。这是完美的解决方案。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的帮助。有没有通用的 sql 公式来获取一年中的正确周数?
    • 我的意思是正确的。第 0 周:这一天属于前一年的最后一周 第 1 周:这一天属于一年中的第一周 第一周 (ISO) 从 1 月 4 日所属的那一周开始。例如:01.01.2013 => 第 1 周,01.01.2012 => 第 52 周 (0),02.01.2012 => 第 1 周,01.01.2010 => 第 53 周 (0),04.01.2010 => 第 1 周
    • 感谢您的出色解决方案。 SQLite 周计算的未记录定义是真正的问题。你的 SQL 正是我要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2019-03-13
    • 1970-01-01
    • 2020-05-22
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多