2014-10-29 157 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格式,并将其存储在一个日期字段,它会解决所有的问题:)