Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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/2/shell/5.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中,运行多个AND检查或强制转换到日期并使用In检查多个日期外观是否更有效? 我需要做什么_Mysql_Sql - Fatal编程技术网

在MYSQL中,运行多个AND检查或强制转换到日期并使用In检查多个日期外观是否更有效? 我需要做什么

在MYSQL中,运行多个AND检查或强制转换到日期并使用In检查多个日期外观是否更有效? 我需要做什么,mysql,sql,Mysql,Sql,我需要能够检查我的MYSQL数据库,以查看记录是否具有发生在所选日期列表上的开始日期时间。日期范围可能会有间隙,所以我不能只使用一个简单的字段>='12-12-2000 00:00:00和

我需要能够检查我的MYSQL数据库,以查看记录是否具有发生在所选日期列表上的开始日期时间。日期范围可能会有间隙,所以我不能只使用一个简单的字段>='12-12-2000 00:00:00和<12-20-2000 00:00:00

我脑子里有两个解决方案,但我没有足够的实际数据来实际测试使用in语句或串联一组AND语句来进行检查是否更有效

目前,我的思考过程让我有两个选择

用于

使用连接的AND语句

这是我提出的两个选择,但是我确信有更多经验丰富的SQL开发人员有更好的方法来完成我正在尝试的工作。我确实读到过,强制转换比只确定开始和结束日期时间慢,但是我不确定这是否仍然适用,即使我可能有5-30个日期来检查每个查询。

强制转换方法不能利用datefield列上的索引

当您有一个或条件时,MySQL通常不使用索引,因此可能需要将第二个版本更改为UNION

顺便说一句,您的日期格式是错误的,它们应该是YYYY-MM-DD,而不是MM-DD-YYYY

如果您使用的是MySQL 5.7或更高版本,那么有一种方法可以为CAST版本编制索引。您可以创建一个值为CASTdatefield AS DATE的,并在此列上添加索引。

CAST方法不能利用datefield列上的索引

当您有一个或条件时,MySQL通常不使用索引,因此可能需要将第二个版本更改为UNION

顺便说一句,您的日期格式是错误的,它们应该是YYYY-MM-DD,而不是MM-DD-YYYY


如果您使用的是MySQL 5.7或更高版本,那么有一种方法可以为CAST版本编制索引。您可以创建一个值为CASTdatefield AS DATE的字段,并在此列上添加索引。

步骤1:将日期/日期时间存储为日期/日期时间步骤1:将日期/日期时间存储为日期/日期时间
SELECT * FROM myTable WHERE
    CAST(datefield as Date) IN ('12-12-2000', '12-13-2000', '12-15-2000', '12-20-2000');
SELECT * FROM myTable WHERE
    (datefield >= '12-12-2000 00:00:00' AND datefield < '12-13-2000 00:00:00')
OR
    (datefield >= '12-13-2000 00:00:00' AND datefield < '12-14-2000 00:00:00')
OR
    (datefield >= '12-15-2000 00:00:00' AND datefield < '12-16-2000 00:00:00')
OR
    (datefield >= '12-20-2000 00:00:00' AND datefield < '12-21-2000 00:00:00')
SELECT * FROM mytable
WHERE (datefield >= '12-12-2000 00:00:00' AND datefield < '12-13-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-13-2000 00:00:00' AND datefield < '12-14-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-15-2000 00:00:00' AND datefield < '12-16-2000 00:00:00')
UNION ALL
SELECT * FROM mytable
WHERE (datefield >= '12-20-2000 00:00:00' AND datefield < '12-21-2000 00:00:00')