2013-06-18 195 views
0

在我的項目中,我正在生成和存儲帳單(發票)。 比爾的日期在保存前從javascript日期選擇器(小彈出式日曆)進入文本框。 日期格式爲:DD-MON-YYYY(2013年6月18日)。在MySql數據庫中使用PHP在兩個日期之間選擇記錄

我正在使用''文本'數據類型在MySql表中存儲日期。

我已經完成了從給定的單一日期類似的表中選擇記錄(前票據)。 。 。

$ result = mysql_query(「SELECT * FROM outward WHERE date ='」。$ date。「'ORDER BY billNo」);現在

,我想要做的是: 兩個日期之間選擇記錄(票據).....

我確切的問題是: 是否有可能查詢MySQL數據庫與此設置或我必須做出一些更改,以有效地選擇2日期之間的記錄? 我怎樣才能做到這一點?

P.s. - 是否有效使用
1.「SELECT * FROM WHERE date BETWEEN'」。 $ from_date。 「'AND'」。 $ to_date。 「」 ORDER BY ID DESC」
或者
2. SELECT * FROM向外WHERE日期> 「15-JUN-2013」​​ 和日期< 「18-JUN-2013」​​

+0

'DATE'或'DATETIME'類型的日期列是? –

+0

您必須更改日期格式才能使用日期字段yyyy-mm-dd – amigura

回答

0

您應該使用strtotime PHP函數將字符串日期轉換爲UNIX時間戳格式,並將日期字段的MySQL數據類型更改爲TIMESTAMP

比你可以用><做有效的查詢。

0

如果它是一個DATE列,您可以使用此獲得2013 6月15日和2013年6月18日(含)之間的所有日期:

WHERE date BETWEEN '2013-06-15' AND '2013-06-18' 

如果它是一個DATETIME列,而是執行此操作:

WHERE date >= '2013-06-15' AND date < '2013-06-19' 

如果對date列進行索引,則此方法將確保索引可用於優化。如果它沒有編入索引,那麼這種方法與其他許多方式一樣快。

附錄:剛剛在所有其他喊叫信息中看到了「存儲爲文本」。請注意,只有在類型爲DATEDATETIME時,此答案才適用。我會留下它,因爲最好的答案是更改列的數據類型,然後使用這個或其他建議的選項之一。

0

我正在使用'文本'數據類型在MySql表中存儲日期。

這是一個問題。您應該在MySQL中將日期存儲爲datedatetime數據類型。如果你不在乎時間部分,date應該足夠。

如果你改變你的數據類型爲日期,然後這樣做:

select x,y,z from table a where a.datecolumn between @startdate and @enddate 

應該正常工作。

如果您使用文本數據類型,則必須將該列轉換爲日期列,然後應用日期選擇範圍,該範圍由於演員表而變慢。

始終將數據存儲在與其種類相匹配的數據類型中。如果是日期然後是日期列,是文本還是文本或varchar等。您的應用的表示層可能會擔心格式,其中該數據會呈現給用戶。

0

你說你使用TEXT列來存儲日期。這是一個非常糟糕的主意。如果您切換到DATEDATETIME,那麼這將變得微不足道。

1

您可以用純SQL方式來完成,但是您將不得不爲每個查詢執行全表掃描。

select the_dates, 
    STR_TO_DATE(the_dates, '%d-%M-%Y') as converted 
from testing 
    where STR_TO_DATE(the_dates, '%d-%M-%Y') between '2013-06-20' and '2013-06-23' 

Link to SQLFiddle

+0

這是更正的答案,但我不會使用它,因爲將日期存儲爲文本沒有任何意義。正如Brian指出,這個查詢不是那麼快 – Pinoniq

+0

@Pinoniq - 我希望我會在將日期字段存儲爲文本之前被拍攝:) –

+0

我會看看我能做什麼;) – Pinoniq

0

既然你是把它作爲文本,但你要SQL解析它作爲一個日期SQL不首先明白。

在你的例子中,SQL將使用TEXT比較規則。所以15-April < 15-Mar> 15-DEC

如果您要在SQL數據庫中存儲日期,則應該將其存儲爲日期而不是TEXT。

相關問題