Php 检索以dd/mm/yyy格式(varchar)存储的两个日期之间的值
我有一张这样的桌子:Php 检索以dd/mm/yyy格式(varchar)存储的两个日期之间的值,php,mysql,sql,date,Php,Mysql,Sql,Date,我有一张这样的桌子: +-----+------------+ | no | Date | +-----+------------+ | 1 | 10/11/2011 | | 2 | 10/12/2011 | | 3 | 10/13/2011 | | 4 | 10/14/2011 | | 5 | 10/15/2011 | +-----+------------+ 我已经编写了以下查询,但它没有返回任何内容,
+-----+------------+
| no | Date |
+-----+------------+
| 1 | 10/11/2011 |
| 2 | 10/12/2011 |
| 3 | 10/13/2011 |
| 4 | 10/14/2011 |
| 5 | 10/15/2011 |
+-----+------------+
我已经编写了以下查询,但它没有返回任何内容,因为date
以dd/mm/yyyy格式存储在varchar
列中
SELECT *
FROM tablname
WHERE date BETWEEN '10/11/2011' AND '10/15/2011'
如果我的日期以dd/mm/yyy格式存储,如何查找两个日期之间的值?
请问,有人能帮我吗
提前感谢如果您将日期存储在VARCHAR中,而不是MySQL的日期列类型中,那么您需要使用MySQL的STR_to_DATE函数(参见Cylindric的答案)
当然,最好将列类型更改为类型。为此,您最好使用新类型创建一个新列,将现有列中的数据从字符串转换为日期,删除现有列,并将新列重命名为旧列的名称。将日期存储为varchar存在许多问题,包括:占用更多空间,可以输入非日期值,字符串的比较不正确 因此,简单的答案是:不要将日期存储为字符串
稍微长一点的答案是将varchar转换为日期类型,然后进行比较。因为转换并不是世界上最有效的事情,所以只需执行一次并存储它。只需添加一个新列并转换原始日期值(这就是我要做的),或者选择一种修改表的方法来更改当前日期列的类型(这可能是更“正确”的方法,但这需要更多的工作,并且取决于您当前使用数据的方式,可能会造成问题).如果您确实必须将数据作为varchar保存,那么您不必首先将其拉入PHP。您可以使用MySQL的日期时间函数来实现此目的 或许
SELECT *
FROM YourTable
WHERE STR_TO_DATE(YourDateColumn,'%d/%m/%Y') < '2011-01-01'
选择*
从你的桌子上
其中STR_TO_DATE(YourDateColumn,'%d/%m/%Y')<'2011-01-01'
前面的答案表明,最好将日期存储为日期类型。在某些用例中,将日期存储为字符串可能是有意义的。在这种情况下,您应该将日期存储为YYYYMMDD,这将允许between按预期工作并进行排序
话虽如此,您可以通过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));
我相信不推荐这种方法的原因是显而易见的。列类型是varchar还是DATE?最好使用timestamp
time()
减去这两个,然后转换为人类可读的日期/时间。您不必在PHP中完成所有操作。只需在MySQL中转换为DATETIME。您的建议要求在每次请求时都将所有数据发送到页面。@JNK不知道STR_to_DATE函数,已对Cylindric的答案进行了投票。但第二部分仍然有效。OP应该将列类型转换为MySQL的原生日期时间类型之一。@LixorVicar我同意使用适当的数据类型,但我担心您会认为将所有数据传递到应用层进行转换是个好主意。@JNK我认为这不是个好主意。我只是没意识到你可以用MySQL来做。我非常习惯于使用原生DATETIME类型,我从未想过可以对日期进行字符串操作(但仍然不是一个好主意!)+1不知道该函数。每天学习新的东西!别忘了“接受”你认为真正回答了你问题的答案。谢谢你的回答,但很抱歉,这个问题不起作用。你能根据我的要求给我准确的查询吗?或者任何简单的查询?我添加了一些日期的倒勾,因为它是一个保留字。但是,您确实需要花点时间学习更多关于sql的知识。
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));