Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 MYSQL选择年份上的日期间隔_Php_Mysql_Date_Select - Fatal编程技术网

Php MYSQL选择年份上的日期间隔

Php MYSQL选择年份上的日期间隔,php,mysql,date,select,Php,Mysql,Date,Select,我创建了一个用户提交的简单表单。一切都很好,但我最近发现 SELECT * FROM `Forms` WHERE `Date` BETWEEN '{$startDate}' AND '{$endDate}' 列Date的类型为TEXT。我需要它是文本,因为我认为以MM/DD/YY格式显示所有内容会更容易。现在我不想冒险更改数据类型,因为表单工作正常 日期列的示例 01-03-2013 01-04-2013 07-25-2012 08-01-2012 08-01-2012 08-01-2012

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

SELECT * FROM `Forms` WHERE `Date` BETWEEN '{$startDate}' AND '{$endDate}' 
Date
的类型为
TEXT
。我需要它是文本,因为我认为以
MM/DD/YY
格式显示所有内容会更容易。现在我不想冒险更改数据类型,因为表单工作正常

日期列的示例

01-03-2013
01-04-2013
07-25-2012
08-01-2012
08-01-2012
08-01-2012
08-01-2012
工作查询的Ex

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'
不工作查询的Ex

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'
如果年份发生变化,它为什么会破裂?即使年份发生变化,我怎样才能让它工作呢

试试这个:

SELECT * FROM `Forms` Where str_to_date(`Date`, '%d/%m/%Y') Between '01-08-2012' and '12-12-2012'

因为您的列是
TEXT
列,所以MySQL将使用字母比较

01-08
位于
01-04
之前,因此实际上是月份部分已经中断


若要解决此问题,请将列转换为日期类型,或将日期顺序反转为日期类型,在这两种情况下,
之间的
应能正常工作。

如果担心该列损坏,请导出数据库,然后进行更改。你不会得到你想要的,因为它是一个文本字段而不是日期字段。MySQL是按字符排序的。就像在看第一个角色,然后是下一个,然后是下一个

就像NAV说的那样,它不会坏,但要做一个备份,只是把它包起来

至于仅显示日期,您可以在空格上分解()以仅获取日期:

<?php

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

?>

试试这个:

select * from "forms" where Date('column_name') between '' and ''

你可以这样做

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

编辑:

如果你想在这里收拾你的桌子,你怎么办

  • 添加适当数据类型的新列:

    ALTER TABLE `Forms` ADD `new_date` DATE AFTER `Date`;
    
  • 使用MySQL函数用旧列中的日期填充新列:

    UPDATE `Forms` SET `new_date` = STR_TO_DATE(`Date`, '%d-%m-%Y');
    
  • 删除旧列(如果需要,将新列重命名):

  • 更改应用程序以使用此新列


  • 因为它是文本01-04。。。。在01-08之前。。。。。将其转换为日期如果数据集很大,则动态转换日期可能不是一个好主意。但如果您的数据集很小,这会很快。听起来很有趣。我们可以在查询中这样做吗?例如,从2012-12-12和2013-01-04之间反向(日期)的表单中选择*?编辑以显示其工作方式以及您是否希望更改表结构。谢谢<代码>从表格中选择*,其中str_to_date(
    date
    ,“%d-%m-%Y”)介于“2012-01-30”和“2013-09-29”之间,效果非常好。我会将数据类型更改说明保存在book mark中。我敢肯定每个人都猜到我不懂SQL。。不遵循SQL表中的标准格式是相当愚蠢的。非常感谢你们,你们帮我省了几个小时的人头痛