0

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

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

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

任何人都可以帮助我吗..

4

6 回答 6

4

您必须将其转换VARCHAR为 aDATE进行比较;

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

一个 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 命令。

转换的 SQLfiddle 演示

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

于 2013-02-02T09:37:49.413 回答
3
SELECT 
    *
FROM
    customer
WHERE
    STR_TO_DATE(dateField, '%m/%d/%Y') BETWEEN '01/20/2012' AND '01/31/2012';

试试这个方法。

于 2013-02-02T11:32:22.650 回答
2

MySQL 日期和时间函数

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');
于 2013-02-02T09:27:18.107 回答
1
  1. 将您的数据类型更改dateDATETIME或简单地更改为,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';
    

更改数据类型的原因在此处进行了解释:何时使用VARCHARDATE/DATETIME

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

于 2013-02-02T09:43:36.313 回答
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


但如果可能的话,您需要将字段类型从 更改VARCHARDATE

于 2013-02-02T09:30:27.807 回答
-1
SELECT * FROM `customer` where date BETWEEN '2012/01/20' AND '2012/31/01'

It will run now because phpmyadmin has been upgraded

于 2013-02-02T12:42:57.503 回答