2010-10-17 437 views
2

如何在MySQL數據庫中最佳地存儲年,月和日,以便按年,按年份,按年 - 月 - 日組合輕鬆檢索?如何在MySQL數據庫中最好地存儲年份,月份和日期?

+0

這是一個模糊的和主觀的問題,但請閱讀這篇文章:HTTP://www.richardlord。net/blog/dates-in-php-and-mysql它會引導你朝着正確的方向發展! – Trufa 2010-10-17 02:16:41

回答

3

除非涉及時間,否則請使用DATE數據類型。您可以使用該功能選擇日期的某些部分。

2

我推薦這個很明顯的:使用DATE

它存儲沒有時間(小時 - 分鐘秒等)組件的年 - 月 - 日。

2

存儲爲日期並使用內置函數:day(),month()或year()來返回所需的組合。

1

DATE有什麼問題?只要您需要Y,Y-M或Y-M-D搜索,它們應該是可索引的。例如,DATE的問題在於,如果您希望跨越數年的所有12月份記錄。

4

比方說,你有一個表tblDATE類型的列d

在1997年的所有記錄:3月10日

SELECT * FROM tbl WHERE YEAR(d) = 1997 AND MONTH(d) = 3 
SELECT * FROM tbl WHERE d BETWEEN '1997-03-01' AND '1997-03-31' 

所有記錄,1997年:

SELECT * FROM tbl WHERE YEAR(d) = 1997 
SELECT * FROM tbl WHERE d BETWEEN '1997-01-01' AND '1997-12-31' 

在三月份的所有記錄1997年的

SELECT * FROM tbl WHERE d = '1997-03-10' 
+1

我是MySQL專家最遠的東西,但我注意到MySQL文檔建議在查詢時明確地將字符串文字轉換爲日期(_WHERE d BETWEEN CAST('1997-03-01'AS DATE)AND CAST( '1997年3月31日')_)。我認爲,否則,日期列值將轉換爲字符串以允許通配符比較,從而無法在列上使用索引。 – 2010-10-17 12:52:20

+0

拉里,我從來沒有聽說過,但它很有意義。謝謝! – benzado 2010-10-18 06:08:48

0

這可能與檔案工作者使用共同日期數據類型的問題。通常情況下,您希望只能編碼年份,或只是年份和月份,具體取決於可用的信息,但您希望能夠將這些信息編碼爲一種數據類型。這是一個不適用於很多其他情況的問題。 (在回答過去的這個問題時,我曾經讓技術人員將其視爲數據問題:數據有問題!)

例如,在作曲家目錄中,您記錄了作曲家過時的事實手稿「1951年1月」。你可以在MySQL DATE字段中放置什麼來表示它? 「1951至1901年」? 「1951-01-00」?兩者都不是真的有效。通常情況下,您最終會在單獨的字段中編碼幾年,幾個月和幾天,然後必須在應用程序級別實現語義。這遠非理想。

0

如果你做對一個固定的日期範圍的分析考慮使用日期維度(爲表奇特的名字),並使用一個外鍵日期維度。看看這個鏈接:

http://www.ipcdesigns.com/dim_date/

如果使用此日期維認爲這將是多麼容易構造查詢反對任何你能想到的日期。

SELECT * FROM my_table 
JOIN DATE_DIM date on date.PK = my_table.date_FK 
WHERE date.day = 30 AND 
     date.month = 1 AND 
     date.year = 2010 

或者

SELECT * FROM my_table 
JOIN DATE_DIM date on date.PK = my_table.date_FK 
WHERE date.day_of_week = 1 AND 
     date.month = 1 AND 
     date.year = 2010 

或者

SELECT *, date.day_of_week_name FROM my_table 
JOIN DATE_DIM date on date.PK = my_table.date_FK 
WHERE date.is_US_civil_holiday = 1 
相關問題