我想从某个日期返回 ISO 标准周数(即第 1-52/53 周)。我曾尝试使用内置函数 strftime,但没有成功。
任何人都可以提出一种无需编写自定义 C 或其他函数的方法。
我知道这是一个老问题,但最近我一直在为同样的问题寻找一个有效的解决方案,这就是我想出的:
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。
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')
好的,所以我设法回答了我自己的问题。对于可能需要类似解决方案的任何人,这就是我想出的。请注意,我没有 IT 背景,我的 SQL 是自学的。
翻译成 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,我将不胜感激。