使用CURRENT_DATE的MySQL遗留代码具有不准确性

时间:2013-08-22 09:33:57

标签: php mysql

刚刚继承了一个填充错误的网站,其中包含日期和事情出现/消失的一些问题。

有很多使用CURRENT_DATE的SQL语句,我相信这可能是一个可能的问题。

是否有其他人知道使用CURRENT_DATE结果导致性能出现任何不准确之处,例如PHP衍生日期字符串,例如date('Y-m-d H:j',time())

1 个答案:

答案 0 :(得分:0)

日期比较可能有几种方法可能出错。它们都与CURRENT_DATE无关,CURRENT_DATE具有标准的,定义良好的,一致的行为。

首先,php通常在Web服务器上执行; CURRENT_DATE在数据库服务器上执行。有时Web服务器和数据库服务器是同一台机器,但有时它们不是。两个不同的服务器可能使用不匹配的时钟。至少在理论上,Web服务器和数据库服务器可以位于(或设置为)两个不同的时区。我自己从来没有见过像这样设置的服务器,但这是可能的。

其次,your PHP expression returns a string(不是日期)采用时间戳的形式(不是以日期的形式)。 CURRENT_DATE返回一个日期。它们的数据类型不同。仔细比较他们的价值观大多数开发人员最初期望像CURRENT_DATE between CURRENT_TIMESTAMP and (CURRENT_DATE + 1)这样的表达式是真的,但事实并非如此。 CURRENT_DATE将被转换为类型timestamp(MySQL中的DateTime),然后与CURRENT_TIMESTAMP进行比较。当它被转换为类型时间戳时,它将是'2013-08-22 00:00:00'。

第三,可能在PHP中有一个格式字符串,它在一个语言环境中为您提供合理排序的值,在另一个语言环境中为您提供不同的排序值。 PHP文档警告不要在“非英语”语言环境中使用date()。 (相同的链接。)

  

要格式化其他语言的日期,您应该使用setlocale()   和strftime()函数代替date()。