1

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

任何人都可以提出一种无需编写自定义 C 或其他函数的方法。

4

3 回答 3

4

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

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

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

于 2013-03-19T10:04:48.723 回答
0

What specifically did you try?
This works for me (using built-in SQLite from Python REPL):

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')
于 2012-02-21T19:09:57.410 回答
0

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

一般流程

  1. 获取日期所属的一周中的星期四。
  2. 获取该星期四当年的 1 月 4 日。
  3. 获取 1 月 4 日日期所属的一周中的星期四。
  4. 步骤 3 减去步骤 2,除以 7 并加 1。

翻译成 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,我将不胜感激。

于 2012-02-22T18:54:17.010 回答