Mysql 如何仅使用日期从DATETIME列中进行选择?
我的表上有一个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
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'