关于mysql:如何从datetime列中选择日期?

How to select date from datetime column?

我有一个"datetime"类型的列,值如2009-10-20 10:00:00

我想从日期时间中提取日期,并编写如下查询:

以下是最好的方法吗?

1
2
3
4
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC

但是,这将返回一个空的结果集。有什么建议吗?


可以使用mysql的DATE()函数:

1
WHERE DATE(datetime) = '2009-10-20'

您也可以尝试:

江户十一〔一〕号

有关使用LIKE的性能影响的信息,请参阅此答案。


使用WHERE DATE(datetime) = '2009-10-20'有性能问题。如前所述:

  • 它将计算所有行的DATE(),包括那些不匹配的行。
  • 它将使查询无法使用索引

使用允许使用索引的BETWEEN><=运算符:

1
2
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'

更新:在索引列中使用LIKE而不是运算符的影响很大。这些是对具有1176000行的表的一些测试结果:

  • 使用datetime LIKE '2009-10-20%'=>2931ms
  • 使用datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'=>168ms

当对同一个查询进行第二次调用时,差异更大:2984ms与7ms(是的,仅7毫秒!).I在使用Hibernate重写项目中的一些旧代码时发现了这个问题。


可以将日期时间格式化为y-m-d部分:

1
DATE_FORMAT(datetime, '%Y-%m-%d')


虽然页面上的所有答案都将返回所需的结果,但它们都存在性能问题。切勿对WHERE子句中的字段进行计算(包括DATE()计算),因为该计算必须对表中的所有行进行。

BETWEEN ... AND构造包含两个边界条件,要求其中一个在结束日期指定23:59:59语法,而这个结束日期本身存在其他问题(微秒事务,我认为2009年提出该问题时MySQL不支持)。

查询特定日期的mysql timestamp字段的正确方法是检查与所需日期是否大于等于,以及之后一天是否小于,而不指定小时。

1
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'

这是执行速度最快、内存最低、资源占用最少的方法,另外还支持所有MySQL特性和角情况,如次秒时间戳精度。此外,它是未来的证据。


这是所有的格式

假设这是包含datetime值的列,表data

1
2
3
4
5
+--------------------+
| date_created       |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
1
2
3
4
5
6
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02         |
+--------------------+

1
2
3
4
5
6
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
|               2018 |
+--------------------+

1
2
3
4
5
6
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
|                   6 |
+---------------------+

1
2
3
4
5
6
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
|                 2 |
+-------------------+

1
2
3
4
5
6
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
|                 15 |
+--------------------+

1
2
3
4
5
6
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
|                   50 |
+----------------------+

1
2
3
4
5
6
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
|                   31 |
+----------------------+


您可以使用:

1
DATEDIFF ( day , startdate , enddate ) = 0

或:

1
2
3
4
5
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)

或:

1
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))


使用日期函数的简单和最佳方法

例子

1
2
3
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'

1
2
3
SELECT * FROM
data
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'


好吧,在"2009-10-20%这样的日期时间"中,使用like-in语句是最好的选择,在这种情况下它应该可以工作