当我在MySQL中编写查询时,例如
SELECT * FROM `customer` where date BETWEEN '01/20/2012' AND '01/31/2012'
它还显示了2013年客户的详细信息。
任何人都可以帮助我..
答案 0 :(得分:4)
您必须将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;
当然,如果没有先进行适当的备份,永远不会尝试使用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)
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)
将date
的数据类型更改为DATETIME
,或简单地将DATE
更改为:
UPDATE `customer`
SET `date` = STR_TO_DATE( `date`, '%m/%d/%Y' );
更新后,请使用ALTER
,如下所示:
ALTER TABLE `customer`
CHANGE COLUMN `date` `date` DATE NOT NULL;
之后,使用这种选择查询:
SELECT *
FROM `customer`
WHERE `date` BETWEEN '2012-01-20' AND '2012-01-31';
为什么更改数据类型的原因在这里解释: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已升级