Mysql 如何从datetime列中选择日期?
我有一个类型为“datetime”的列,其值类似于2009-10-20 10:00:00 我想从datetime中提取date并编写如下查询:Mysql 如何从datetime列中选择日期?,mysql,date,datetime,Mysql,Date,Datetime,我有一个类型为“datetime”的列,其值类似于2009-10-20 10:00:00 我想从datetime中提取date并编写如下查询: 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')
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
但是,这将返回一个空结果集。有什么建议吗?您可以使用MySQL的功能:
WHERE DATE(datetime) = '2009-10-20'
您也可以尝试以下方法:
WHERE datetime如“2009-10-20%”
有关使用的性能影响的信息,请参见,如您可以使用:
DATEDIFF ( day , startdate , enddate ) = 0
或:
或:
好的,在语句中使用像一样是最好的选择
WHERE datetime如“2009-10-20%”
在这种情况下它应该可以工作您可以将日期时间格式化为Y-M-D部分:
DATE_FORMAT(datetime, '%Y-%m-%d')
使用日期函数的简单且最佳的方法
范例
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'
或
从中选择*
资料
其中日期(datetime)>='2009-10-20'和日期(datetime)使用其中日期(datetime)='2009-10-20'
存在性能问题。如上所述:
- 它将计算所有行的
DATE()
,包括不匹配的行
- 这将使查询无法使用索引
在或
之间使用,2931ms
使用datetime>='2009-10-20 00:00:00'和datetime 168ms
在同一个查询上进行第二次调用时,差异更大:2984ms与7ms(是的,只有7毫秒!)。我在使用Hibernate重写项目中的一些旧代码时发现了这一点。尽管页面上的所有答案都将返回所需的结果,但它们都存在性能问题切勿对WHERE
子句中的字段执行计算(包括DATE()
计算),因为必须对表中的所有行执行该计算。
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
之间的。。。而且
construct包含两种边界条件,需要在结束日期指定23:59:59语法,这本身就有其他问题(微秒事务,我认为MySQL在2009年提出问题时不支持)
查询特定日期的MySQL时间戳
字段的正确方法是,检查所需日期是否大于等于,后天是否小于等于,并且没有指定小时。
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
其中datetime>='2009-10-20'和datetimeHere都是格式
假设这是包含表数据的datetime
值的列
+--------------------+
| date_created |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
尝试了这个:其中DATE(datetime)='2009-10-20',第一个非常慢,并且忽略了索引。最好使用像“date%”这样的日期(datetime)像“%keyword%”一样工作,谢谢。我相信如果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”。如果我错了,请纠正我,因为这也是我直到最近才明白的。WHERE DATE(datetime)=“{?sdate}非常适合Crystal Reports参数!干得好!有趣的是,如果MySql实现自动将DATE(datetime)
转换为和
之间的场景,我们会得到简短的语句和出色的性能。为什么不呢?他们为什么不这样做?:)因为(:list)
中的DATE(datetime)之类的内容不适用于之间的,这样,如果需要,您只能获得时间部分:DATE\u格式(datetime,%H:%i:%S')
设置日期时间格式非常有效,但作为回报,数据库将返回一个新数组来设置名称,只需使用结束日期格式(columnName,“%Y-%m-%d”)中所需的名称即可。有关详细信息,请查看文档,并使用性能参数检查“>=”和“@JavierGuerrero:我的示例比较了两个常量:“表中的一个”和一个字符串文字。“表中的一个”不是一个常量,它随每一行而变化,因此必须对每一行进行相同的计算(而且,两者都必须转换为历元时间来执行比较)
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
+--------------------+
| 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 |
+----------------------+