如何从datetime列中选择日期?

mys*_*ner 218 mysql datetime date

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

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

SELECT * FROM 
data 
WHERE datetime = '2009-10-20' 
ORDER BY datetime DESC
Run Code Online (Sandbox Code Playgroud)

以下是最好的方法吗?

SELECT * FROM 
data 
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Run Code Online (Sandbox Code Playgroud)

但是,这会返回一个空结果集.有什么建议?

Pri*_*lia 414

你可以使用MySQL的DATE()功能:

WHERE DATE(datetime) = '2009-10-20'
Run Code Online (Sandbox Code Playgroud)

你也可以试试这个:

WHERE datetime LIKE '2009-10-20%'

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

  • 第一个非常慢,忽略了索引.LIKE'date%'更好 (42认同)
  • 第一个杀死你的页面表现! (5认同)
  • 试过这个:DATE(datetime)='2009-10-20',它有效 (2认同)
  • 我相信如果Rails时区不是UTC时,这将无法按预期工作。这是因为DATE()将列值解析为UTC。因此,找不到希望查询“ 2016-12-30”的日期,例如“星期五,2016年12月30日00:00:00 SGT +08:00”。为什么?因为DATE()会在进行比较之前将其解析为其UTC等效项,即“ 2016-12-29 16:00:00 UTC”。如果我错了,请纠正我,因为直到最近我还是对我有所了解。 (2认同)

Iva*_*nRF 88

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

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

使用BETWEEN>,<,=运营商允许使用一个索引:

SELECT * FROM data 
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
Run Code Online (Sandbox Code Playgroud)

更新:在索引列中使用而不是运算符的影响很大.这些是一个包含1,176,000行的表的测试结果:LIKE

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

当通过同一个查询进行第二次调用时,差异甚至更高:2984ms vs 7ms(是的,只有7毫秒!).我在使用Hibernate重写项目的旧代码时发现了这一点.


Pru*_*rus 24

您可以将日期时间格式化为YMD部分:

DATE_FORMAT(datetime, '%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

  • 这样,如果需要,你只能获得时间部分:`DATE_FORMAT(datetime,'%H:%i:%S')` (2认同)

dot*_*hen 13

虽然页面上的所有答案都会返回所需的结果,但它们都存在性能问题.永远不要对子WHERE句中的字段执行计算(包括DATE()计算),因为必须对表中的所有行执行计算.

BETWEEN ... AND结构包含两个边界条件,要求在结束日期指定23:59:59语法,这个语法本身也有其他问题(微秒事务,我相信MySQL在2009年提出问题时不支持).

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

WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
Run Code Online (Sandbox Code Playgroud)

这是性能最快,内存最少,资源最少的方法,并且还支持所有MySQL功能和角落情况,例如亚秒级时间戳精度.此外,它是未来的证明.


Sir*_*lam 8

这是所有格式

假设这是包含datetime值table 的列data.

+--------------------+
| date_created       |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02         |
+--------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
|               2018 |
+--------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
|                   6 |
+---------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
|                 2 |
+-------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
|                 15 |
+--------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
|                   50 |
+----------------------+
Run Code Online (Sandbox Code Playgroud)
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
|                   31 |
+----------------------+
Run Code Online (Sandbox Code Playgroud)


Mic*_*len 5

您可以使用:

DATEDIFF ( day , startdate , enddate ) = 0
Run Code Online (Sandbox Code Playgroud)

要么:

DATEPART( day, startdate ) = DATEPART(day, enddate)
AND 
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
Run Code Online (Sandbox Code Playgroud)

要么:

CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
Run Code Online (Sandbox Code Playgroud)


Raj*_*lam 5

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

例子

SELECT * FROM 
data 
WHERE date(datetime) = '2009-10-20' 
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM 
data 
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'
Run Code Online (Sandbox Code Playgroud)