SQLite ISO(即欧洲风格)周数

时间:2012-02-21 18:56:46

标签: sqlite numbers iso strftime

我想从日期返回ISO标准周数(即1-52 / 53周)。 我尝试过使用内置函数strftime,但没有成功。

任何人都可以建议一种方法,而无需编写自定义C或其他功能。

3 个答案:

答案 0 :(得分:2)

我知道这是一个老问题,但最近我一直在为同样的问题找到一个有效的解决方案,这就是我想出的:

SELECT
    my_date,
    (strftime('%j', date(my_date, '-3 days', 'weekday 4')) - 1) / 7 + 1 as iso_week
FROM my_table;

基本思想是通过简单地执行查询日期的星期四(y_date)的星期几的整数除以7来计算ISO周数,得到0到52之间的结果,然后加1它。并且在除法之前减1只是为了除法的对齐:例如,第1周的星期四可以有1到7之间的一年中的一天,并且我们希望除法的结果为0在所有情况下,我们需要从一年中减去1,然后除以7。

答案 1 :(得分:0)

你有什么具体的尝试?
这适用于我(使用Python REPL内置的SQLite):

import sqlite3
c = sqlite3.connect(':memory:')
c.execute('''create table t (c);''')
c.execute('''insert into t values ('2012-01-01');''')
c.execute('''select c, strftime('%W',c) from t;''').fetchone()
# -> (u'2012-01-01', u'00')

答案 2 :(得分:0)

好的,所以我设法回答了我自己的问题。对于任何可能需要类似解决方案的人来说,这就是我想出的。请注意,我没有IT背景,我的SQL是自学成才。

一般过程

  1. 获取日期所属的星期四。
  2. 获得该星期四一年的第一个月。
  3. 获得本周四的1月4日日期也属于。
  4. 用步骤3减去步骤2,除以7并加1。
  5. 翻译成SQLite ....

    SELECT
    date,
    CASE CAST (strftime('%w', wknumjanfourth) AS INTEGER)
      WHEN 0 THEN ((JULIANDAY(datesThur) - JULIANDAY(strftime("%s", wknumjanfourth) - 259200, 'unixepoch')) / 7) + 1   
      ELSE ((JULIANDAY(datesThur) - JULIANDAY(DATE(strftime("%s", wknumjanfourth) - (86400 * (strftime('%w', wknumjanfourth) - 1)), 'unixepoch'), '+3 day')) / 7) + 1
    END AS weeknum
    FROM
    (
      SELECT
      date,
      datesThur,
      DATE(datesThur,'start of year','+3 day') AS wknumjanfourth
      FROM
      (SELECT 
        date,
        CASE CAST (strftime('%w', date) AS INTEGER)
          WHEN 0 THEN DATE(strftime("%s", date) - 259200, 'unixepoch')
          ELSE DATE(DATE(strftime("%s", date) - (86400 * (strftime('%w', date) - 1)), 'unixepoch'), '+3 day')
          END AS datesThur
       FROM TEST
    ))
    

    如果有人可以改进这个SQL,我会很感激反馈。