2011-03-30 58 views
2

當使用DATETIME功能做一些算術,我發現以下行爲:SQLite DATETIME函數'中斷''-1個月'?

選擇DATETIME(「現在」,「-1個月」,「月開始」)
預期:2011-02 -01 00:00:0
結果:2011-03-01 00:00:0 - 失敗

選擇DATETIME( '現在', '-2個月', '月開始')
預期: 2011-01-01 00:00:0
結果:2011-01-01 00:00:0 - 好吧

This only appe自從昨天開始,我的集成測試就開始了。我的猜測是,扣除的月份是以天爲單位計算的,並且不知何故使用了上個整月的天數(而不是當前天數)。最後一個整月,2月精選28天,因此結果)

這很容易通過改變輸入到DATETIME函數的順序來解決,如下所示:DATETIME('now','start of month',' - 1個月「),但仍然是棘手的行爲,並可能導致不被注意的錯誤。

我使用System.Data.SQLite.DLL /版本1.0.66.0/2010年4月18日

別人發現了這種行爲?這是一個已知的錯誤?或者我「做錯了」?

回答

4

now減1個月= 2月30日= 3月2日。然後給你3月的開始。這可能不是任何人想要的行爲,但它是文檔描述的內容:轉到http://www.sqlite.org/lang_datefunc.html並搜索「通過渲染進行作品」。

+0

我看你是對的(跟着鏈接)。這是有道理的,以一種扭曲的方式。但我自己的邏輯也不穩定,可能更是如此。無論如何,謝謝你幫助我理解。 – Rick 2011-03-30 12:01:20

1

我很確定這是工作as documented

注意,「±NNN個月」的工作原理是使原來的日期到 YYYY-MM-DD格式,加入±NNN以 的MM月份值,則歸 結果。因此,例如,由'+1月' 修改的 數據2001-03-31最初產生2001-04-31,但4月 僅有30天,所以日期爲 歸一化爲2001-05-01。

我希望標準化之前的變化是2月30日,這不是一個有效的日期。

+0

你是對的,按照記錄工作。雖然這有點棘手。但我不得不承認,我還沒有看到更好的方法來處理這個問題。 – Rick 2011-03-30 15:12:52

+0

我認爲唯一的方法就是更明確地表達你想要的東西。我想到的方式「一個月」有不止一個含義,所以它沒用。 「30天」只有一個意思。 「上個月的第一個」只有一個含義。 – 2011-03-30 15:36:58

3

相反的:

SELECT datetime('now','-1 month','start of month'); 

你試過:

SELECT datetime('now','start of month','-1 month'); 

我認爲第二個會永遠給你前一個月的第一天。如果當前月份中的天數比前一個月多,則前者有時會爲您提供當月的第一天。