我有一个类型为“datetime”的列,其值为2009-10-20 10:00:00
我想从datetime中提取日期并编写如下查询:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
以下是最好的方法吗?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
然而,这会返回一个空的结果集。有什么建议吗?
答案 0 :(得分:375)
您可以使用MySQL的DATE()
功能:
WHERE DATE(datetime) = '2009-10-20'
你也可以试试这个:
WHERE datetime LIKE '2009-10-20%'
有关使用LIKE
的性能影响的信息,请参阅this answer。
答案 1 :(得分:80)
使用WHERE DATE(datetime) = '2009-10-20'
有性能问题。如上所述here:
DATE()
,包括那些不匹配的行使用允许使用索引的BETWEEN
或>
,<
,=
运算符:
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
更新 影响使用LIKE
代替索引列中的运算符为高。这些是一个包含1,176,000行的表的测试结果:
datetime LIKE '2009-10-20%'
=&gt; 2931ms datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=&gt; 168ms 当对同一个查询进行第二次调用时,差异甚至更高:2984ms vs 7ms(是的,只有7毫秒!)。我在使用Hibernate重写项目的旧代码时发现了这一点。
答案 2 :(得分:23)
您可以将日期时间格式化为Y-M-D部分:
DATE_FORMAT(datetime, '%Y-%m-%d')
答案 3 :(得分:10)
虽然页面上的所有答案都会返回所需的结果,但它们都存在性能问题。 永远不要对WHERE
子句中的字段执行计算(包括DATE()
计算),因为必须对表中的所有行执行计算。
BETWEEN ... AND
构造包含两个边界条件,要求在结束日期指定23:59:59语法本身有其他问题(微秒事务,我相信MySQL在2009年不支持当提问时)。
查询某个特定日期的MySQL timestamp
字段的正确方法是检查所需日期的大于等于,以及后一天的小于等级,未指定小时强>
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
这是性能最快,内存最少,资源最少的方法,并且还支持所有MySQL功能和角落情况,例如亚秒级时间戳精度。此外,这是未来的证明。
答案 4 :(得分:6)
假设这是包含datetime
值的列,表data
。
+--------------------+
| date_created |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02 |
+--------------------+
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
| 2018 |
+--------------------+
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
| 6 |
+---------------------+
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
| 2 |
+-------------------+
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
| 15 |
+--------------------+
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
| 50 |
+----------------------+
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
| 31 |
+----------------------+
答案 5 :(得分:4)
您可以使用:
DATEDIFF ( day , startdate , enddate ) = 0
或者:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
或者:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
答案 6 :(得分:3)
使用日期功能的简单和最佳方式
示例
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'
OR
SELECT * FROM
data
WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20'
答案 7 :(得分:-1)
好吧,使用like in statement是最好的选择,其中datetime如'2009-10-20%',它应该适用于这种情况