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
Mysql 如何仅使用日期从DATETIME列中进行选择?_Mysql_Sql_Database_Datetime - Fatal编程技术网

Mysql 如何仅使用日期从DATETIME列中进行选择?

Mysql 如何仅使用日期从DATETIME列中进行选择?,mysql,sql,database,datetime,Mysql,Sql,Database,Datetime,我的表上有一个DATETIME列,用于存储创建记录的时间。我只想选择在特定日期创建的记录。如果我尝试: SELECT * FROM myTable WHERE postedOn = '2012-06-06' 即使表中有许多行的postedOn设置为 2012-06-06 21:42:02,2012-06-06 07:55:17,等等 有什么想法吗 SELECT * FROM myTable WHERE DATE(postedOn) = '2012-06-06' DATE()返回datet

我的表上有一个DATETIME列,用于存储创建记录的时间。我只想选择在特定日期创建的记录。如果我尝试:

SELECT * 
FROM myTable
WHERE postedOn =  '2012-06-06'
即使表中有许多行的
postedOn
设置为
2012-06-06 21:42:02
2012-06-06 07:55:17
,等等

有什么想法吗

SELECT *
FROM myTable
WHERE DATE(postedOn) = '2012-06-06'
DATE()返回datetime字段的日期部分

使用标量:


通过向日期添加日期来创建时间范围:

SELECT * 
FROM myTable
WHERE postedOn >= '2012-06-06' and postedOn < '2012-06-07'
选择*
从myTable
其中postedOn>='2012-06-06'和postedOn<'2012-06-07'

这是最有效的方法,因为查询可以在字段上使用索引。

如果有很多记录,这可能会使查询速度变慢吗?不。另一种方法更糟糕:保留两个字段,一个用于日期,一个用于时间。@tony在维护方面更差,但性能如何?@ClickUpvote:您可以用EXPLAIN检查。我刚刚运行了它,它说它将使用索引(这是意料之中的)。因此,优化应该很好。我相信DATE()只读取DateTime字符串的一部分,所以我认为它与从不同字段读取一样快。原始代码无法工作的原因是,没有日期完全等于“2012-06-06 00:00:00”,正如其他人所建议的,使用DATE(),在上,值将删除时间信息并使比较返回结果。您始终可以使用以下技巧截断
datetime
的时间:
CAST(FLOOR(CAST(some_datetime AS FLOAT))AS datetime)
-我的最爱之一。用于报告日期汇总非常方便。必须为此执行第二次查询才能执行
选择日期\u添加($oldDate,interval 1 day)
或计算第二天日期的等效操作,因此与使用
日期()
@ClickUpvote:计算下一天日期只需执行一次,然后这些值可以直接与索引进行比较。使用date()意味着它必须使用表扫描来计算表中每个值的日期值。
SELECT * 
FROM myTable
WHERE postedOn >= '2012-06-06' and postedOn < '2012-06-07'