Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Select - Fatal编程技术网

MySQL选择datetime与日期匹配的位置(不一定是时间)

MySQL选择datetime与日期匹配的位置(不一定是时间),mysql,date,select,Mysql,Date,Select,我有一个包含datetime列的表。我希望返回给定日期的所有记录,无论时间如何。或者换句话说,如果我的表只包含以下4条记录,那么如果我限制为2012-12-25,则只返回第2条和第3条记录 2012-12-24 00:00:00 2012-12-25 00:00:00 2012-12-25 06:00:00 2012-12-26 05:00:00 。。。其中日期列>='2012-12-25'和日期列从不使用类似于date(日期列)='2012-12-24'的选择器-它是性能杀手: 它将计算所

我有一个包含datetime列的表。我希望返回给定日期的所有记录,无论时间如何。或者换句话说,如果我的表只包含以下4条记录,那么如果我限制为2012-12-25,则只返回第2条和第3条记录

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

。。。其中日期列>='2012-12-25'和日期列从不使用类似于
date(日期列)='2012-12-24'
的选择器-它是性能杀手:

  • 它将计算所有行的
    DATE()
    ,包括那些不匹配的行
  • 这将使查询无法使用索引
使用起来要快得多

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'
因为这将允许在不进行计算的情况下使用索引

编辑

正如Used_by_已经指出的那样,自2012年首次给出答案以来,已经出现了MySQL版本,使用“23:59:59”作为日终不再安全。更新版本应为

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'
从tablename中选择*
其中列名>='2012-12-25 00:00:00'

和columname您可以使用
%

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

table
where Date(col)=“Date”

中选择*我正要评论a1ex07的解决方案似乎不如其他解决方案好。读完你的帖子后,也许我需要改变我的想法!刚刚在两台服务器上进行了测试,上述速度比date()=''快很多(至少10倍),特别是对于大型表。Thanks@KonradViltersten我用了一种非常冗长的方式来表达这个查询,以使它更具可读性,并使我的观点更加明确,a.o.t.对其进行了改进。a1ex07的答案具有稀疏语法。@KonradViltersten-更好的是:
其中col>='2012-12-25'和col<'2012-12-25'+间隔1天
。它避免了0时间,适用于
日期
日期时间
日期时间(6)
,并处理闰日等。2012-12-25 23:59:59作为一天的结束是无效的,这始终是一个坏主意,它将导致MySQL版本的错误,支持亚秒时间精度。最好使用Rick James(上图)或a1ex07(其他答案)的方法,就像DATE(datetimecol)一样慢。最好使用Eugen或a1ex07的解决方案。这并不总是关于速度。所以我喜欢这个解决方案。它更具可读性。我真的想知道什么更快-这或
之间的
解决方案。。。有人被打过记号吗?应该没什么区别
BETWEEN
只是一种写入
field>=value1和fiedNote的方法。请注意,根据MySQL手册:“使用BETWEEN和日期或时间值时,要获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。示例:如果将DATETIME与两个日期值进行比较,则将日期值转换为DATETIME值。如果在与日期进行比较时使用字符串常量(如“2001-1-1”),则将字符串转换为日期。“因此,除非它们都是相同类型,最好是明确地投下它们。参见John Woo的答案,例如,“日期”可以是2012-12-25,(col)是你的专栏