-3

我有一张这样的桌子:

   +-----+------------+
   | 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 格式存储,如何找到两个日期之间的值?

请问,有人可以帮帮我吗?

提前致谢

4

4 回答 4

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'
于 2012-04-06T14:23:41.133 回答
3

If you're storing your dates in a VARCHAR and not in one of MySQL's DATE column types then you'll need to use MySQL's STR_TO_DATE function (see Cylindric's answer).

Of course, much better would be to change the column type to a DATE or DATETIME type. To do this, you're best creating a new column with the new type, converting the data in the existing column from a string to a date, dropping the existing column and renaming the new column to the name of the old column.

于 2012-04-06T14:10:55.203 回答
1

将日期存储为 varchar 存在许多问题,包括:占用更多空间、您可以输入非日期值以及字符串无法正确比较。

所以,简短的回答是:不要将日期存储为字符串!

稍长的答案是将 varchar 转换为 DATE 类型,然后进行比较。由于转换并不是世界上最有效的事情,因此只需执行一次并存储它。要么只添加一个新列并转换原始日期值(这是我要做的),要么选择一种修改表格的方法来更改当前日期列的类型(这可能更“正确”方法,但它需要更多的工作,并且取决于您当前使用数据的方式,可能会破坏事情)。

于 2012-04-06T14:20:31.497 回答
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));

我相信很明显为什么不推荐这种方法。

于 2012-04-06T14:45:01.793 回答