我有一个这样的表:
+-----+------------+
| 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 格式存储,如何找到两个日期之间的值?
拜托,有人能帮我吗?
提前致谢
如果你真的必须将数据保留为 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'
如果你将日期存储在VARCHAR中,而不是存储在MySQL的DATE列类型中,那么你需要使用MySQL的STR_TO_DATE函数(参见Cylindric的答案)。
当然,更好的方法是将列类型更改为 DATE 或 DATETIME 类型。为此,最好使用新类型创建新列,将现有列中的数据从字符串转换为日期,删除现有列并将新列重命名为旧列的名称。
日期存储为 varchar 存在许多问题,包括: 它占用更多空间,您可以输入非日期值,并且字符串无法正确比较。
所以,简短的回答是:不要将日期存储为字符串!
稍长的答案是将 varchar 转换为 DATE 类型,然后进行比较。 由于转换并不是世界上最有效的事情,因此只需执行一次并存储它。 要么添加一个新列并转换原始日期值(这就是我要做的),要么选择一种修改表的方法来更改当前日期列的类型(这可能是更"正确"的方法,但它需要做更多的工作,具体取决于您当前如何使用数据, 可能会破坏东西)。
正如前面的答案所表明的那样,最好将日期存储为日期类型。 在某些用例中,将日期存储为字符串可能有意义。 在这种情况下,您应该将日期存储为 YYYYMMDD,这反过来又允许在排序之间按预期工作。
话虽如此,您可以使用子字符串/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));
我相信,为什么不推荐这种方法是相当明显的。