Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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/6/eclipse/8.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
mysql查询在日期之间选择显示错误答案_Mysql - Fatal编程技术网

mysql查询在日期之间选择显示错误答案

mysql查询在日期之间选择显示错误答案,mysql,Mysql,当我在MySQL中编写查询时,例如 SELECT * FROM `customer` where date BETWEEN '01/20/2012' AND '01/31/2012' 它还显示了2013年客户的详细信息 谁能帮我一下吗 假设date字段类型为date SELECT * FROM `customer` WHERE `date` BETWEEN '2012-01-20' AND '2012-01-31' 从手册 日期类型用于包含日期部分但不包含时间部分的值。MySQL以“YYYY

当我在MySQL中编写查询时,例如

SELECT * FROM `customer` where date BETWEEN '01/20/2012' AND '01/31/2012'
它还显示了2013年客户的详细信息

谁能帮我一下吗


假设
date
字段类型为
date

SELECT * FROM `customer` WHERE `date` BETWEEN '2012-01-20' AND '2012-01-31'
从手册

日期类型用于包含日期部分但不包含时间部分的值。MySQL以“YYYY-MM-DD”格式检索并显示日期值

参考:

更新

但是,将日期存储为
varchar
是个坏主意,可能查询如下:

SELECT * FROM `customer` WHERE `date` REGEXP '^2012-01-(2[0-9]|[0-3][0-9])$'
参考:



但如果可能,您需要将字段类型从
VARCHAR
精确更改为
DATE
您必须将
VARCHAR
转换为
DATE
进行比较

SELECT *
FROM `customer` 
WHERE STR_TO_DATE(`date`, '%m/%d/%Y')
BETWEEN '2012-01-20' AND '2012-01-31'

请注意,这将丢失列上的所有索引,因为在比较之前需要转换每一行,这对性能不好

在VARCHAR中存储日期通常被视为一个坏主意,排序顺序非常重要,如果系统在国际上使用,则月/日很容易混淆。我建议您将日期列转换为
date
数据类型

编辑:这是一种在不丢失现有数据的情况下转换列的方法

# Add a new DATE column
ALTER TABLE `customer` ADD COLUMN tmpdate DATE;
# Transfer the data from the VARCHAR column to the DATE column
UPDATE `customer` SET tmpdate=STR_TO_DATE(`date`, '%m/%d/%Y');
# Drop the old VARCHAR column
ALTER TABLE `customer` DROP COLUMN `date`;
# Rename the new DATE column to `date`.
ALTER TABLE `customer` CHANGE `tmpdate` `date` DATE;
当然,如果不先进行适当的备份,就不应该尝试使用ALTERTABLE命令

请注意,依赖日期格式的PHP代码可能需要一些更新才能使用
date

  • date
    的数据类型更改为
    DATETIME
    或简单地更改为
    date
    ,如下所示:

    UPDATE `customer`
        SET `date` = STR_TO_DATE( `date`, '%m/%d/%Y' );
    
    ALTER TABLE `customer`
        CHANGE COLUMN `date` `date` DATE NOT NULL;
    
  • 更新后,按如下方式使用
    ALTER

    UPDATE `customer`
        SET `date` = STR_TO_DATE( `date`, '%m/%d/%Y' );
    
    ALTER TABLE `customer`
        CHANGE COLUMN `date` `date` DATE NOT NULL;
    
  • 然后,使用这种选择查询:

    SELECT *
    FROM `customer`
    WHERE `date` BETWEEN '2012-01-20' AND '2012-01-31';
    

  • 下面解释了更改数据类型良好的原因:

    在此处读取其他与日期和时间相关的数据类型:

    这样试试

    SELECT * FROM `customer` where date BETWEEN '2012/01/20' AND '2012/31/01'
    

    它现在会运行,因为phpmyadmin已经升级了

    日期字段类型是什么?你知道MySQL中有一个数据类型
    DATETIME
    ?据我所知,
    01/29/2013
    是给定范围之间的
    。范围仅为b/w 2012年…但它显示2013年的结果。@sandeep
    date
    列的数据类型是什么?MySQL返回了一个空结果集。这就是为什么有一个
    date
    数据类型,用于有效地存储日期,然后使用比较运算符(
    =<>=介于
    之间)安全。作为旁注,如果使用此方法,请确保VARCHAR
    date
    列有足够的空间来容纳stru-to-date的结果,否则结果可能会很糟糕。@JoachimIsaksson
    01/20/2012
    =10个字符,
    2012-01-20
    =10个字符。是的,在这种情况下它会起作用,但是有日期格式的人03年2月1日可能需要再次检查。在那里,做了,对自己不满意:)