SQL日期
我想它是這樣的:服務器實際存儲的日期爲某一天的參考。它怎麼做,這不關你的事。將數據存儲到日期列或從日期列讀取數據時,服務器使用特定的日曆來表示該日期,該日曆按照慣例是格雷戈裏。我想說的是,我不認爲存儲的價值是格雷戈裏,雖然它可能是。我寧願考慮轉讓日期爲格雷戈裏。
因此,在我看來,最好的解決方案是接受這一事實,並在應用程序方面轉換格里高利和Hijri。這樣,你可以使用正常的between
檢查。從數字
如果這是不可能由
字符串,由於該區域設置相關的轉換太複雜了,還是因爲愨回曆和Grogorian映射不是唯一的或者事先不知道的,那麼你將不得不以其他形式存儲日期。我想到的可能的形式是包含YYYY-MM-DD
形式的字符串的varchar
,其中字母表示數字。這種方案可以確保字符串與其所代表的日期相比較,因此您仍然可以使用between
。儘管如此,將這些字符串轉換爲拼寫出來的日期仍然很棘手。
一個或多個數字列
所以我真的建議你使用三列,每個包含數標誌着一個日期,然後,您可以使用10000*year + 100*month + day_of_month
獲得每一天的單號,你可以使用進行比較和between
。另一方面,您可以在查詢中使用功能ELT
將該月份的號碼恢復爲名稱。如果性能問題,您可能會更好地存儲一個數字,並在選擇時將其分成若干部分。在公曆,這應該是這樣的:
CREATE TABLE tableName (myDate DECIMAL(8));
SELECT myDate DIV 10000 AS year,
ELT((myDate DIV 100) MOD 100, "Jan", "Feb", …) AS month,
myDate MOD 100 AS day_of_month
FROM tableName
WHERE myDate BETWEN 20121021 AND 20121023;
兼容性和方便
如果你要保持只讀與代碼,只需要一個文本日期列的兼容性,您可以使用VIEW
提供。例如,對於德國公曆DD. MMMM YYYY
格式,你可以使用這樣的代碼:
CREATE VIEW compatibleName AS
SELECT CONCAT(myDate MOD 100, ". ",
ELT((myDate DIV 100) MOD 100, "Januar", "Februar", …), ". ",
myDate DIV 10000) as dateString,
* -- or explicitely name other columns needed for compatibility
FROM tableName
解碼串
如果你需要使用字符串格式讀寫被其他應用程序的訪問,你必須解析那些絃樂自己。您可以在SQL級別執行此操作。有用的工具是SUBSTRING_INDEX
將字符串拆分爲字段並FIELD
將月份名稱轉換爲數字。您可能需要向數據庫添加觸發器,以確保您的字符串始終處於可以以這種方式分解的有效格式。 This question給出瞭如何使用觸發器來執行這些檢查的詳細信息。
來源
2012-10-22 05:24:17
MvG
STR_TO_DATE()的MySQL函數可以used.may是性能下降 –
感謝@ArunKillu,試了一下,沒有工作。性能對我們來說不是問題。我們可以隨時調整它,但現在,str_to_date只會將字符串轉換爲日期,但這並不意味着mysql的'date'將允許我將它作爲日期存儲。試過了,沒有工作。因爲,MySQL假設「日期」中的任何內容都必須是僅有英文的數字。 – Karma
可以用英文存儲日期,然後在檢索後將其轉換爲阿拉伯文。 –