我有我的數據庫「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)。我只是不知道該怎麼做,所以我需要一些幫助。
我有我的數據庫「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)。我只是不知道該怎麼做,所以我需要一些幫助。
這可能是不可能做到與varchar字段,或複雜的地獄。儘管理論上可以在mySQL中使用Regex函數來匹配模式,但您正在尋找日期範圍。即使有可能以某種方式構建查詢,它也將是一大堆工作,而且mySQL無法爲其任何方面進行優化。
正常,快速和直接的方式去了解這是normalizing your table.
在你的情況,你可能會創建一個名爲「日誌」的新表,它是通過一個ID字段顯示連接到現有的表每個日誌條目屬於哪個父記錄。
查詢某一日期範圍屬於特定父日誌條目則變得容易,因爲
SELECT log_date FROM logs WHERE parent = 155 AND log_date >= CURDATE()
這是痛苦的,在第一次做(因爲你必須重建結構的部分和有可能的,你的應用程序),並使一些日常查詢更復雜,但像這樣的情況變得更容易和更快。
不幸的是我不能編輯表格(如果我可以的話),所以我堅持使用它。我想我會選擇所有,然後在PHP中查看日期。 – SilverSilencer
@SilverSilencer確實看起來是當時唯一的出路。 MySQL可能沒有這樣的工具。 –
原則上我同意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
注#1:這是一種解決方法爲您的具體情況。
如果你有機會,你應該規範你的表格。
注#2我不是MySql的傢伙。我的大部分sql經驗都是使用Sql server。
您可能會找到一種更好的方法將字符串轉換爲日期,然後使用cast
來克服像1.3.2015
這樣的值的不明確性。
這對varchar字段來說會非常複雜,如果不是不可能的話。這需要適當的[規範化。](http://stackoverflow.com/questions/1258743/normalization-in-mysql)這很痛苦,使一些查詢更復雜,但像這樣的情況變得更容易和更快。 –
在PHP中,我得到了preg_match('#\((。*?)\)#',$ data,$ dateinside);「的日期,但我不知道如何在sql調用中獲取它... – SilverSilencer
preg_match很簡單,但您想測試日期範圍。不知道這是否可能。你會更好地規範化你的數據庫,檢查我添加的鏈接上面 –