现在是凌晨12点15分,但我的NOW()认为是昨天

时间:2014-09-10 04:30:24

标签: php mysql datetime time

我在这里遇到了一个棘手的问题。我的数据库查询不准确,因为 NOW()函数似乎有错误的时区。

首先,在连接到数据库之后,我使用以下代码设置了适当的时区:

ini_set('date.timezone', 'America/Toronto');

mysql_connect('localhost', 'myusername', 'mypassword') or die(mysql_error());
mysql_select_db('mydatabase') or die(mysql_error());

mysql_query("SET SESSION time_zone = 'America/Toronto'");

正如您所看到的,我也通过PHP设置了时区。

问题在于我正在运行以下脚本,尽管现在是12:24,但昨天正在输出 SUM()

以下是我正在使用的代码:

$sql = mysql_query("select 
    website,
    sum(case when date_format(from_unixtime(`date_assigned`), '%Y-%m-%d') = date_format(now(), '%Y-%m-%d') then 1 else 0 end) AS c_today 
    from `assignments` 
    group by website
    order by website asc
    ") or die(mysql_error());

正如我所提到的,c_today正在给我昨天的SUM()。这引起了重大问题,因为各地的计数似乎都没有了。

这里发生了什么,为什么它不能正常工作?

我尝试在此脚本中使用以下代码:

echo '<p>Current server time is: '.date('F j Y, g:ia', time()).'<br />';
echo 'Current database time is: '.date('F j Y, g:ia', mysql_result(mysql_query("select unix_timestamp(now())"), 0)).'</p>';

这个回声是:

Current server time is: September 10 2014, 12:28am
Current database time is: September 10 2014, 12:28am

非常感谢任何帮助。

修改

我取得了一些进展。

我在脚本中添加了以下内容:

echo mysql_result(mysql_query("select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));"), 0);

这与-07:00:00相呼应,意味着它已经过了2个小时。如果我在连接后明确使用了以下代码,为什么它会在2小时后关闭?

mysql_query("SET SESSION time_zone = 'America/Toronto'");

这应该是-05:00:00,而不是-07:00:00

编辑2:

使用SET SESSION time_zone查询显示对实际设置会话时区完全没有影响。

2 个答案:

答案 0 :(得分:1)

似乎我没有数据库中可用的位置字符串,以便使用“America / Toronto”来设置时区。这就是它无法正常工作的原因。

因此,我将其更改为以下代码,现在可以使用:

mysql_query("SET time_zone = '-5:00'");

答案 1 :(得分:0)

一如既往地调试问题,形成有关所有可能原因的假设并对其进行测试。在这种情况下,您可以使用其他SELECT列发出各种更简单的查询和查询,以查看正在进行的操作。

可能出现的问题(可能会出现一个或多个问题):

  • 未正确设置SQL Server日期/时间和时区。 - 您测试的是日期/时间而不是时区,因此缩短错误时区的时间可能是错误的。有许多关于设置服务器时间和时区的文档,例如How do I set the time zone of MySQL?
  • 您的数据行的时间戳错误。 - 插入一些新值并检查它们。您是否使用SQL服务器的时钟为它们添加时间戳,或者在插入行时提供时间戳?
  • 您的查询并未按预期执行。在from_unixtime()date_format()及其格式arg之间(虽然看起来对我来说还行),case when(使用if(test, 1, 0)代替?)或其他内容(它没有&#39;似乎按日期查询,只计算具有所需日期的行数,错误有很多机会。 - 尝试一些更简单的查询和一些输出更多信息的查询,例如为具有所需日期的每一行选择格式化的date_assigned