3

我创建了一个用户提交的简单表单。一切都很好,但我最近发现

SELECT * FROM `Forms` WHERE `Date` BETWEEN '{$startDate}' AND '{$endDate}' 

该列Date是 type TEXTMM/DD/YY我需要它是文本,因为我认为以格式显示所有内容会更容易 。现在我不想冒险更改数据类型,因为表单工作正常。

日期列示例

01-03-2013
01-04-2013
07-25-2012
08-01-2012
08-01-2012
08-01-2012
08-01-2012

工作查询前

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '12-12-2012'

前不工作查询

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '01-04-2013'

如果年份发生变化,有什么理由会破坏它?即使年份发生变化,我怎样才能让它工作。

4

5 回答 5

5

你可以那样做

SELECT * FROM `Forms` 
WHERE str_to_date(`Date`, '%d-%m-%Y') BETWEEN '2012-01-30' AND '2013-09-29'

在这里演示

编辑 :

如果你想在这里修你的桌子你怎么做

  1. DATE添加适当数据类型的新列:

    ALTER TABLE `Forms` ADD `new_date` DATE AFTER `Date`;
    
  2. 使用 MySQL 的STR_TO_DATE()函数用旧列中保存的日期填充该新列:

    UPDATE `Forms` SET `new_date` = STR_TO_DATE(`Date`, '%d-%m-%Y');
    
  3. 删除旧列(如果需要,在其位置重命名新列):

    ALTER TABLE `Forms` DROP `Date`, CHANGE `new_date` `Date` DATE;
    
  4. 更改您的应用程序以使用此新列。

于 2013-01-04T17:39:39.950 回答
4

因为您的列是TEXT列 MySQL 将使用字母比较。

01-08出现在之前01-04,所以实际上已经是月份部分了。

要解决此问题,请将列转换为DATE类型或将日期的顺序反转为YYYY-MM-DD,在这两种情况下都BETWEEN应该正常工作。

于 2013-01-04T17:30:50.030 回答
2

试试这个::

SELECT * FROM `Forms` Where str_to_date(`Date`, '%d/%m/%Y') Between '01-08-2012' and '12-12-2012'
于 2013-01-04T17:29:16.213 回答
0

如果您担心它会损坏然后导出数据库然后进行更改。您不会得到您期望的结果,因为它是 TEXT 字段而不是日期字段。MySQL按字符排序。因为它正在查看第一个字符,然后是下一个字符,然后是下一个字符。

就像 navnav 说的那样,它不会损坏,但会进行备份。

至于仅显示日期,您可以在空间上爆炸()以仅获取日期:

<?php

list($date, $time) = explode(" ", $datetime, 2);
echo $date;

?>
于 2013-01-04T17:32:53.027 回答
0

试试这个:

select * from "forms" where Date('column_name') between '' and ''
于 2013-01-04T17:33:49.820 回答