mysql查询在日期之间选择显示错误答案
当我在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
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年的结果。@sandeepdate
列的数据类型是什么?MySQL返回了一个空结果集。这就是为什么有一个date
数据类型,用于有效地存储日期,然后使用比较运算符(=<>=介于
之间)安全。作为旁注,如果使用此方法,请确保VARCHARdate
列有足够的空间来容纳stru-to-date的结果,否则结果可能会很糟糕。@JoachimIsaksson01/20/2012
=10个字符,2012-01-20
=10个字符。是的,在这种情况下它会起作用,但是有日期格式的人03年2月1日可能需要再次检查。在那里,做了,对自己不满意:)