Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从datetime列中选择日期?_Mysql_Date_Datetime - Fatal编程技术网

Mysql 如何从datetime列中选择日期?

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')

我有一个类型为“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')
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 |
    +----------------------+