Web*_*cer 7 sqlite strftime week-number
我在SQLite的报告中有一个简单的SQL来计算周数
SELECT STRFTIME('%W', 'date_column')
Run Code Online (Sandbox Code Playgroud)
对于2009-2012非常正确.在2013年,我总是错误的周数.
例如
SELECT STRFTIME('%W', '2012-02-28')
Run Code Online (Sandbox Code Playgroud)
返回'09',这是正确的.
SELECT STRFTIME('%W', '2013-02-28')
Run Code Online (Sandbox Code Playgroud)
返回'08',这是错误的.我们有第9周.
SQLite日期时间函数中有什么我不明白的东西吗?或者它是SQLite的错误?
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;
Run Code Online (Sandbox Code Playgroud)
另外,SQLite的日期和时间文档确实链接到POSIX strftime手册页,它将%W修饰符定义为:" 年份的周数(星期一作为一周的第一天)作为十进制数[00,53].在第一个星期一之前的新年中的所有日子被认为是在第0周. "
要将 SQLite 未记录的周定义(第一周是一年中第一个星期一的周,或 1 月 7 日所在的周)转换为 ISO 周定义(第一周是一年中的第一个星期二所在的周,或包含 1 月 4 日的那一周),我们让 SQLite 计算一年中的 1 月 4 日那一周。如果这不是一个,我们必须增加周数:
SELECT strftime('%W', MyDate)
+ (1 - strftime('%W', strftime('%Y', MyDate) || '-01-04'))
FROM MyTable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4204 次 |
| 最近记录: |