2013-02-26 54 views
4

我對SQLite的2013年SQLite返回錯誤的週數?

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

這是正確的計算2009-2012我的報告中週數一個簡單的SQL。在2013年,我總是得到錯誤的週數。

例如

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

回報 '09',這是正確的。

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

return'08',這是錯誤的。我們有第九周。

有什麼在SQLite的日期時間函數,我不明白?或者它是SQLite的錯誤?

回答

6

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

+0

感謝您的回答。我會檢查解決方案。 – WebDucer 2013-03-29 15:54:26

+0

這是否比建議的解決方案更好?測試? – l33t 2013-05-03 08:14:59

+1

@ l33t:如果您想計算** ISO **週數,則「更好」。這和原來的解決方案有時在一年中的最後3天和前3天有一次或多次不同。例如,2011年1月1日的ISO週數爲52,原始解決方案將其計算爲0.或2012年12月31日的ISO周爲1,原始解決方案輸出53。 是的,我也對它進行了測試,範圍爲50年,並且輸出與python的'datetime.isocalendar()'方法的輸出相同。 – srdan 2013-05-17 11:00:23

3

要將SQLite未公開的星期定義(第一週是其中包含年份第一個星期一的星期或具有1月7日的那一週)轉換爲ISO星期定義(第一週是包含年份第一個星期二或1月4日的那一週),我們讓SQLite計算1月4日的一週。如果這不是一個,我們要增加週數:

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

感謝您的幫助。有一個共同的SQL公式來獲得一年的正確的週數嗎? – WebDucer 2013-02-26 21:22:12

+0

定義「正確」。 – 2013-02-27 08:06:15

+0

我的意思是以下的權利。 第0周:當天屬於前一年的最後一週 第1周:當天屬於本年的第一週 第一週(ISO)以1月4日所屬的周開始至。 例如: 2013年1月1日=>第一週, 01.01.2012 =>第52周(0),2012年2月1日 =>第一週, 01.01.2010 =>第53周(0), 04.01.2010 =>第1周 – WebDucer 2013-02-27 22:09:16

相關問題