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

时间:2013-02-02 09:22:19

标签: mysql

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

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

它还显示了2013年客户的详细信息。

任何人都可以帮助我..

6 个答案:

答案 0 :(得分:4)

您必须将VARCHAR转换为DATE才能进行比较;

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

An SQLfiddle

请注意,这会遗漏您列上的所有索引,因为在比较之前需要转换每一行,这对性能不利。

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

当然,如果没有先进行适当的备份,永远不会尝试使用alter table命令。

An SQLfiddle demonstration of the conversion

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

答案 1 :(得分:3)

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

试试这种方式。

答案 2 :(得分:1)

MySQL Date & Time Functions

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

答案 3 :(得分:1)

假设date字段类型为DATE;

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

来自手册;

  

DATE类型用于具有日期部分但没有时间部分的值。 MySQL以'YYYY-MM-DD'格式检索并显示DATE值。

参考:http://dev.mysql.com/doc/refman/5.5/en/datetime.html

<强>更新

但是,将日期存储为varchar是个坏主意,也许查询可能是这样的:

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

参考:http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp


但如果可能,您需要将字段类型从VARCHAR更改为DATE

答案 4 :(得分:1)

  1. date的数据类型更改为DATETIME,或简单地将DATE更改为:

    UPDATE `customer`
        SET `date` = STR_TO_DATE( `date`, '%m/%d/%Y' );
    
  2. 更新后,请使用ALTER,如下所示:

    ALTER TABLE `customer`
        CHANGE COLUMN `date` `date` DATE NOT NULL;
    
  3. 之后,使用这种选择查询:

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

  4. 为什么更改数据类型的原因在这里解释:When to use VARCHAR and DATE/DATETIME

    在此处阅读其他与日期和时间相关的数据类型:The DATE, DATETIME, and TIMESTAMP Types

答案 5 :(得分:-1)

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

它将立即运行,因为phpmyadmin已升级