当使用MariaDB(MySQL(时,我们希望将DATETIME转换为可读的DATE,并且至少知道以下方法,所有这些方法都会产生相同的日期输出,但。。。考虑到对话将出现在大型数据集的几列上,这些转换之间的实际性能是否存在差异
DATE(NOW())
CAST(NOW() AS DATE)
DATE_FORMAT(NOW(), '%Y-%m-%d')
CONVERT(NOW(), DATE)
数据库位于网络服务器上,其他用户使用该服务器,因此";试错;不会产生可靠的结果。我无法解释其他用户在数据库上运行的任何内容和/或可能同时发生的任何其他网络/服务器活动。制作本地副本将提供更稳定(但并非完全(的结果,但在我们的coporate设备上,我们无法获取数据库副本。
这个问题特别针对这四种选择与其他任何选择之间的差异,我可能没有考虑过";它们之间有实际的区别吗;
如果像这样的函数出现在SELECT
子句中,则使用它们不会对查询性能产生任何显著影响。差异太小,无法测量:每行最多几十纳秒。使用一个让你的查询最容易让下一个人阅读的查询,不要回头看。
不过,DATE_FORMAT()
会生成一个文本字符串。除非你想控制报表中日期的确切格式,否则你应该避免这种情况。
如果它们出现在WHERE
子句中,MySQL可能无法在日期列上使用索引。例如,这会影响你的表现。
WHERE DATE(timestampcolumn) = DATE(NOW()) /* slow! */
这很慢,因为它必须对表中的每一行计算DATE()
函数。示例中的其他约定也是如此。
如果你想做那种过滤,那就这样做吧。
WHERE timestampcolumn >= DATE(NOW())
AND timestampcolumn < DATE(NOW()) + INTERVAL 1 DAY
如果您在timestampcolumn
上有一个索引,那么这个WHERE
子句将对该索引进行范围扫描,从而节省服务器上的大量工作。
性能无显著差异。
但这应该比所有提到的更快:
CURDATE()
(如果您需要当前日期以外的其他信息,请参阅O.Jones的回答。(
另一点:任何";常数";表达式将为查询求值一次,而不是每行求值一次。这意味着NOW()
或CURDATE()
的所有值在整个查询中将是相同的。
并进一步指出了DATE(column)
对大表的低效性。