我有一个产生如下结果的查询:
数据按日期DESC排序,然后按时间DESC排序,但常见的'markers_name'元素也被排在一起。 (他们每个日期只是在一起)。
要执行此操作,我会在MAX(time)
中获取(markers_id, date)
的每个组合的conditions
值列表,然后将该列表加入我从当前查询中获取的行集,并且使用MAX(time)
值进行排序:
SELECT
m.name AS markers_name,
c.time AS conditions_time,
c.date AS conditions_date,
s.name AS station_name
FROM markers m
INNER JOIN conditions c ON c.markers_id = m.id
INNER JOIN station s ON c.station_id = s.id
INNER JOIN (
SELECT
markers_id,
date,
MAX(time) AS time
FROM conditions
GROUP BY
markers_id,
date
) mx ON c.markers_id = mx.markers_id AND c.date = mx.date
ORDER BY
c.date DESC,
mx.time DESC,
m.name DESC,
c.time DESC
日期和时间以UTC时间的形式存储在MySQL数据库中。客户端使用javascript将日期和时间转换为本地时区。 相反,我想用php和MySQL在服务器上进行转换。任何人都可以提出任何有关如何使用MySQL查询(或者使用php和MySQL)实现此目的的建议吗?
客户端使用ajax从服务器请求此数据,因此我可以使用javascript方法getTimezoneOffset()轻松地在查询中包含时区偏移。
使用以下代码使用单独的日期和时间字段将日期存储到数据库中:
// convert timestamp to seconds
// time is provided by client as the number of milliseconds since January 1, 1970 00:00:00 UTC.
$utc_timestamp = trim($_POST['utc_timestamp']);
date_default_timezone_set('UTC');
$utc_timestamp = $utc_timestamp/1000;
$time = date("H:i:s",$utc_timestamp);
$date = date("Y:m:d",$utc_timestamp);
如果有必要,我可以存储$ utc_timestamp而不是$ time和$ date,但改变我存储数据的方式有点可怕。
提前致谢....
答案 0 :(得分:1)
您可以将date_default_timezone_set()
与localtime($utc_timestamp)
或date($utc_timestamp)
结合使用,将UTC时间戳转换为您选择的时区。
date_default_timezone_set()
的已接受参数列表(时区)可在此处找到:
这仍然需要您使用某种客户端脚本(javascript)来检索用户的时区,因为客户端不会将此信息发送到服务器。
我建议您应该更改为存储$utc_timestamp
,因为它是您可以比较任何两个字符串的常量时间度量。如果你想比较不同条目的年龄,那么将来会更容易.etc
答案 1 :(得分:1)
这就是我用php解决我的问题的方法。
客户端使用javascript:
获取时区偏移量var date = new Date();
var utcOffset = -date.getTimezoneOffset()/60;
客户端通过ajax将偏移量发送到服务器,服务器获取偏移量:
$utcOffset = isset($_REQUEST["utcOffset"]) ? $_REQUEST["utcOffset"] : 0;
$pieces = explode(".", $utcOffset);
$hours = $pieces[0];
// handle '.5' because some timezones include a half hour portion
if (sizeof($pieces) == 1)
$minutes = 0;
else
$minutes = '.' . $pieces[1];
// convert .5 to 30
$minutes *= 60;
if ($hours[0] == '-')
$minutes = '-' . $minutes;
服务器查询数据库(这在我的原始帖子中显示)。然后我的php迭代结果并生成xml,然后发送回客户端。在该循环中,我已经放置了此代码,它将日期和时间从UTC转换为客户端的本地时间:
$time = date('g:i a', strtotime($hours . ' hours,' . $minutes . ' minutes', strtotime(date($row['conditions_date'] . $row['conditions_time']))));
$date = date('D, M j, Y', strtotime($hours . ' hours,' . $minutes . ' minutes', strtotime(date($row['conditions_date'] . $row['conditions_time']))));
所以在数据库中,我的日期为'2012-01-01',这次'20:22:11'。当客户提供-5(这是东部标准时间的值)时,上面的代码将时间转换为'3:22 pm',日期转换为'Sun,Jan 1,2012'。