2014-10-29 81 views
0

因爲設計我有一個3選擇下拉菜單(日,月,年)分隔的表格 我加入日期之前保存它到MySQL使用Post(d)Post m Post(Y)插入日期像$ d- $ m- $ Y從表單方法後我將日期保存在一個varchar 20列加入dmY並節省罰款MySQL select table column 31-12-2014 type varchar as date date by date php

日期顯示正常30-10-2014

現在的問題是,在搜索結果頁面中我要搜索日期之間的結果B和得到什麼

也同時在搜索結果我按日期的訂單我得到的結果是從任何日期

我不知道如何訂購或使用這種保存在VARCHAR這裏日期的篩選結果是什麼,我現在測試

$result = mysqli_query($db, "SELECT product, price, DATE_FORMAT(date, '%d-%m-%Y') AS new_date FROM `tableone` WHERE `user` = '$usernamefromform' ORDER BY `new_date` DESC Limit $start, $per_page"); 

我怎樣才能解決這個不改變這麼多專門不是我的設計,請

+0

存儲日期爲VARCHAR壞計劃。現在,當您想要將數據列用作日期時,您必須每次都處理此問題。你不必爲了顯示而將其格式化,而是做了更多的工作來做其他事情。這是倒退 - 您將數據以結構化* data *格式放入數據庫,然後在顯示時更改顯示格式的格式。而不是解決這個特定的問題(可以用'CAST'或類似的方法完成),我建議你現在停下來修復你的數據庫模式。 – 2014-10-29 22:53:56

回答

2

你是在正確的軌道上,但是你定義之前DATE_FORMAT你需要將您的VARCHAR轉換成日期。此外,您需要格式化的方式,可以進行適當的排序(因此只使用ORDER BY)的日期,但它顯示它的存儲方式(如果這就是你想要的):

SELECT product, price, date 
FROM `tableone` 
WHERE `user` = '$usernamefromform' 
ORDER BY DATE_FORMAT(STR_TO_DATE(date, '%d-%m-%Y'), '%Y%m%d') DESC 

構建BETWEEN查詢與實在是太差了(可能減緩都記錄下來),但是當你轉換的VARCHARDATE您現在可以使用下面的查詢:

SELECT product, price, date 
FROM `tableone` 
WHERE `user` = '$usernamefromform' AND (date BETWEEN '2014-01-30' AND '2014-12-31') 
ORDER BY date DESC 
+0

從VARCHAR更改爲DATE,它工作正常,非常感謝 – Grupo456436657 2014-10-29 22:56:16

+0

此查詢解決症狀,但未經治療而使疾病。日期的Varchar是不好的設計,應該在數據庫中修復。否則,只要他想要分類或使用'between'之間的任何時候,他都必須在這個樣板中加入他的代碼。呸。 – 2014-10-29 22:56:57

+0

這絕對是正確的,我不會鼓勵這種解決方案,但OP寫它是通過設計,因此我猜他正在維護一個現有的項目,並需要一個答案。 – Paul 2014-10-29 22:58:16

1

這是一個非常糟糕的主意,您日期存儲在DD-MM-YYYY格式爲varchar。這可以防止您能夠按日期排序或搜索兩個日期之間的日期。

如果將其更改爲YYYY-MM-DD格式,並將其存儲在一個日期字段,它會解決所有的問題:)