Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检索以dd/mm/yyy格式(varchar)存储的两个日期之间的值_Php_Mysql_Sql_Date - Fatal编程技术网

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));