2010-10-21 54 views
51

例如,下面的查询工作正常:MySQL的日期时间比较

SELECT * 
    FROM quotes 
WHERE expires_at <= '2010-10-15 10:00:00'; 

但是,这显然是执行“字符串”比较 - 我想知道是否有内置于MySQL的一个函数,专门做“日期时间”比较。

回答

104

...这显然是执行“串”比较

没有 - 如果日期/时间格式所支持的格式相匹配,MySQL的执行隐式转换的值转换为DATETIME ,根据它正在比较的列。同样的事情发生的:

WHERE int_column = '1' 

...其中的“1”的字符串值转换为整数,因为int_column的数据类型为int,没有CHAR/VARCHAR/TEXT。

如果你想将字符串显式转换为DATETIME,该STR_TO_DATE function将是最好的选择:

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s') 
+7

如果您的服务器或字符串不在UTC时要小心,因为隐式转换发生在服务器/会话time_zone中,而不是与其进行比较的值的时区。所以即使将它与UTC_TIMESTAMP()进行比较,该字符串也是相同的本地time_zone。 – ClearCrescendo 2012-12-28 17:23:20

+0

@ClearCrescendo:好点,thx。 – 2013-01-01 21:59:44

18

但是,这显然是执行“串”比较

号的字符串将被自动转换成DATETIME值。

参见11.2. Type Conversion in Expression Evaluation.

当操作者与不同类型的操作数使用,类型转换发生,使操作数兼容。一些转换隐式发生。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。

0

我知道它很老,但我只是遇到这个问题,有我在看到SQL doc:

[为了在使用BETWEEN与日期或时间值时获得最佳结果,]使用CAST()将值显式转换为所需的数据类型。示例:如果将DATETIME与两个DATE值进行比较,请将DATE值转换为DATETIME值。如果在比较DATE时使用字符串常量(如“2001-1-1”),则将该字符串强制转换为DATE。

我想这是最好使用STR_TO_DATE,因为他们花了时间做只是一个功能,并且还,我发现这个在文档之间的事实...