2012-04-06 55 views
-3

我有一臺這樣的:檢索存儲在DD/MM/YYY格式(VARCHAR)兩個日期之間的值

+-----+------------+ 
    | no | Date  | 
    +-----+------------+ 
    | 1 | 10/11/2011 | 
    | 2 | 10/12/2011 | 
    | 3 | 10/13/2011 | 
    | 4 | 10/14/2011 | 
    | 5 | 10/15/2011 | 
    +-----+------------+ 

我寫了下面的查詢,但因爲date存儲在它沒有返回值一個varchar列,格式爲dd/mm/yyyy。

SELECT * 
FROM tablname 
WHERE date BETWEEN '10/11/2011' AND '10/15/2011' 

如何找到兩個日期之間的值,如果我的日期存儲在DD/MM/YYY格式?

請問,任何人都可以幫助我嗎?

在此先感謝

+0

是列類型varchar還是DATE? – Yada 2012-04-06 14:11:07

+0

最好使用時間戳'time()'減去兩個並轉換爲人類可讀的日期/時間。 – gorelative 2012-04-06 14:14:05

回答

3

如果你存儲在VARCHAR,而不是在MySQL的DATE列類型的一個日期,那麼你就需要使用MySQL的STR_TO_DATE功能(見圓柱形的答案)。

當然,更好的辦法是將列類型更改爲DATE or DATETIME類型。爲此,最好使用新類型創建一個新列,將現有列中的數據從字符串轉換爲日期,刪除現有列並將新列重命名爲舊列的名稱。

+0

您不必在PHP中完成所有操作。只需在MySQL中轉換爲DATETIME即可。您所建議的要求將所有數據發送到每個請求的頁面。 – Cylindric 2012-04-06 14:24:30

+0

這是一個相當愚蠢的建議... – JNK 2012-04-06 14:26:06

+0

@JNK不知道STR_TO_DATE函數,有upvoted Cylindric的答案。但第二部分依然存在。 OP應該將列類型轉換爲MySQL的本地DATETIME類型之一。 – liquorvicar 2012-04-06 14:42:58

1

作爲varchars存儲日期有許多問題,包括:它佔用更多空間,可以輸入非日期值,並且字符串不能正確比較。

所以,簡短的答案是:不要按店鋪日期排列!

略長的答案是將varchar轉換爲DATE類型,然後再比較。由於轉換並不是世界上最有效率的事情,所以只做一次並存儲它。或者只是添加一個新列並轉換原始日期值(這是我會做的),或者選擇修改表的方法之一來更改當前日期列的類型(這可能是更「正確的」方法,但這需要多一點工作,並且取決於您當前如何使用這些數據,可能會破壞某些東西)。

6

如果您確實必須將數據保存爲varchar,那麼您不必首先將它拉入到PHP中。您可以使用MySQL的日期時間函數此

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

SELECT STR_TO_DATE(YourDateColumn,'%d/%m/%Y') AS RealDateColumn 
FROM YourTable 

或許

SELECT * 
FROM YourTable 
WHERE STR_TO_DATE(YourDateColumn,'%d/%m/%Y') < '2011-01-01' 
+0

+1不知道這個函數。每天學些新東西! – liquorvicar 2012-04-06 14:42:00

+0

非常感謝你,我喜歡這個答案 – SB24 2012-12-05 06:17:28

+0

不要忘記「接受」你認爲實際上回答你的問題的答案。 – Cylindric 2014-05-22 11:30:33

0

由於以前的答案都表示這是最好的存儲日期爲日期類型。有一些使用情況下,將日期作爲字符串存儲可能有意義。在這種情況下,您應該將您的日期存儲爲YYYYMMDD,然後這些日期將允許按預期工作以及排序。

話雖如此,你可以用substring/concat函數實現你的目標。例如:

SELECT * FROM tablname WHERE 
CONCAT(substring(`date`,7,4),substring(`date`,1,2),substring(`date`,3,2)) 
BETWEEN 
CONCAT(substring('10/11/2011',7,4),substring('10/11/2011',1,2),substring('10/11/2011',3,2)) AND 
CONCAT(substring('10/11/2011',7,4),substring('10/11/2011',1,2),substring('10/11/2011',3,2)); 

我相信這是相當明顯的爲什麼不推薦這種方法。

+0

謝謝您的回覆,但我很抱歉,此查詢無效。 您能否根據我的要求給我發確切的查詢?或爲此目的的任何簡單的查詢? – zzzzz 2012-04-06 16:50:57

+0

由於是保留字,因此我添加了一些約會日期。但你真的需要花時間學習更多關於sql的知識。 – Cerad 2012-04-06 18:40:05