2015-05-07 69 views
0

我有我的數據庫「VARCHAR」領域,我已保存記錄等:varchar中的MySql日期(選擇正確的日期)?

(11.1.2015) Log info 1 
(17.4.2015) Log info 2 
(22.5.2015) Log info 3 
(25.5.2015) Log info 3 
... 

現在我想提出選取日期內()相同或比今天更大,選擇的第一個(所以在這個樣本和今天的日期,我應該得到22.5.205)。我只是不知道該怎麼做,所以我需要一些幫助。

+1

這對varchar字段來說會非常複雜,如果不是不可能的話。這需要適當的[規範化。](http://stackoverflow.com/questions/1258743/normalization-in-mysql)這很痛苦,使一些查詢更復雜,但像這樣的情況變得更容易和更快。 –

+0

在PHP中,我得到了preg_match('#\((。*?)\)#',$ data,$ dateinside);「的日期,但我不知道如何在sql調用中獲取它... – SilverSilencer

+0

preg_match很簡單,但您想測試日期範圍。不知道這是否可能。你會更好地規範化你的數據庫,檢查我添加的鏈接上面 –

回答

0

這可能是不可能做到與varchar字段,或複雜的地獄。儘管理論上可以在mySQL中使用Regex函數來匹配模式,但您正在尋找日期範圍。即使有可能以某種方式構建查詢,它也將是一大堆工作,而且mySQL無法爲其任何方面進行優化。

正常,快速和直接的方式去了解這是normalizing your table.

在你的情況,你可能會創建一個名爲「日誌」的新表,它是通過一個ID字段顯示連接到現有的表每個日誌條目屬於哪個父記錄。

查詢某一日期範圍屬於特定父日誌條目則變得容易,因爲

SELECT log_date FROM logs WHERE parent = 155 AND log_date >= CURDATE() 

這是痛苦的,在第一次做(因爲你必須重建結構的部分和有可能的,你的應用程序),並使一些日常查詢更復雜,但像這樣的情況變得更容易和更快。

+0

不幸的是我不能編輯表格(如果我可以的話),所以我堅持使用它。我想我會選擇所有,然後在PHP中查看日期。 – SilverSilencer

+0

@SilverSilencer確實看起來是當時唯一的出路。 MySQL可能沒有這樣的工具。 –

1

原則上我同意Pekka웃這一個。
你應該總是努力爲您的數據使用適當的數據類型。
這也意味着從來沒有使用一列來存儲2個不同的數據段。

但是,從評論Pekka웃的答案我明白,改變表是不可能的,所以這是我的嘗試做到這一點。
假設你的約會總是在爲varchar開始,始終用括號包圍,你也許可以做這樣的事情:

SELECT * 
FROM (
    SELECT 
      CAST(SUBSTR(Log_data, 2, LOCATE(')', Log_data)-1) as date) LogDate, 
      SUBSTR(Log_data, LOCATE(')', Log_data)+1, CHAR_LENGTH(Log_data)) LogData 
    FROM logs_table 
) NormalizedLogTable 
WHERE LogDate >= CURDATE() 
Limit 1 

See sql fiddle here.

注#1:這是一種解決方法爲您的具體情況。
如果你有機會,你應該規範你的表格。

注#2我不是MySql的傢伙。我的大部分sql經驗都是使用Sql server。
您可能會找到一種更好的方法將字符串轉換爲日期,然後使用cast來克服像1.3.2015這樣的值的不明確性。