MariaDB日期发短信,哪种方式



当使用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)对大表的低效性。

相关内容

最新更新