我在这里遇到了一个棘手的问题。我的数据库查询不准确,因为 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
查询显示对实际设置会话时区完全没有影响。
答案 0 :(得分:1)
似乎我没有数据库中可用的位置字符串,以便使用“America / Toronto”来设置时区。这就是它无法正常工作的原因。
因此,我将其更改为以下代码,现在可以使用:
mysql_query("SET time_zone = '-5:00'");
答案 1 :(得分:0)
一如既往地调试问题,形成有关所有可能原因的假设并对其进行测试。在这种情况下,您可以使用其他SELECT列发出各种更简单的查询和查询,以查看正在进行的操作。
可能出现的问题(可能会出现一个或多个问题):
from_unixtime()
,date_format()
及其格式arg之间(虽然看起来对我来说还行),case when
(使用if(test, 1, 0)
代替?)或其他内容(它没有&#39;似乎按日期查询,只计算具有所需日期的行数,错误有很多机会。 - 尝试一些更简单的查询和一些输出更多信息的查询,例如为具有所需日期的每一行选择格式化的date_assigned
。