2012-11-28 55 views
3

我來自非數據庫背景。我創建了一個包含字段數據類型TEXT的表格。在sqlite3中處理日期令人困惑。

dataF TEXT 

插入:

已插入三個記錄與價值觀:

'842-2-4' 
'842-2-5' 
'842-2-6' 

選擇:

特林得到基於日期,現在的記錄。

... where dateF between '842-2-4' and '842-2-10' 

它失敗。

然而,

... where dateF between '842-2-4' and '842-2-8' 

檢索所有3條記錄。

我在做什麼錯了?爲什麼第一個聲明失敗?

請提出建議。

回答

1

比較字符串時,值進行比較左至右...

作爲一個字符串較短,其他,你是那種比較這...

'842-2-4' 
'842-2-1' 

那麼,沒有什麼是>= '842-2-4'<= '842-2-1'

  • 因爲'842-2-1'出現在'842-2-4'之前。
  • 因此,'842-2-10'也在'842-2-4'之前。

  • 正如'Squiggled'到來之前'Squiggly'

  • 而作爲'xxx-y-az'到來之前'xxx-y-z'


要比較你的願望,確保所有日期填充與0的。

BETWEEN '0842-02-04' AND '0842-02-10' 

但你已經在你的表格填充出來的值也只會工作。


編輯

此外,請注意,這假設你的格式是YYYY-MM-DD。由於字符串從左到右進行比較,因此您的必須左側的量級值最高。

(這意味着你不能使用YYYY-DD-MM,仍然有本地的字符串比較的行爲,你會希望他們。)

+0

我試圖插入填充'0',但仍然是相同的結果:( – Whoami

+0

@ Whoami - 你是否改正了你的表中的數據?使用你的例子,你應該插入''0842-02-04'',''0842- 02-05''和''0842-02-06''和***然後***也修改您的查詢以使用完全相同的數據格式:'dateF BETWEEN'0842-02-04'AND'0842-02 -10''。*(表格中的數據和搜索參數**必須是**完全相同的格式。)* – MatBailie

+0

是的,做過同樣的事情。 – Whoami

3

因爲你比較字符串而不是日期。電腦不知道這些是日期。您必須將其作爲日期進行存儲並進行日期比較,或者實施自己的邏輯來分析字符串。

簡而言之,它將10分之一視爲小於你的值,而不是10以上。這是字符串比較,而不是日期。

雖然sqlite不支持日期類型,但它確實有處理它們的函數。在這裏看到:

http://www.sqlite.org/lang_datefunc.html

+0

SQLite沒有一個本地日期數據類型。 –

+0

我如何插入日期格式? – Whoami

+0

編輯答案,請參閱鏈接,這應該有所幫助。 – HackyStack