服務器我有一個產生這樣一個結果的查詢:轉換日期和時間從UTC到客戶端的本地時間與MYSQL
的數據按日期降序排序,然後按時間倒序,而且常見的'markers_name'元素也被組合在一起。 (他們只在每個日期分組在一起)。
要做到這一點,我得到MAX(time)
值的列表中conditions
的(markers_id, date)
每一個組合,然後再加入該列表的行集我從本查詢得到,並使用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存儲$時間和$日期,而不是,但它是一個有點嚇人改變我一直在存儲我的數據的方式。
在此先感謝....
謝謝,但我恐怕我不太關注。我想我明白,如果我想根據客戶的時區存儲數據,這可能會有所幫助。但我不明白這是如何幫助我檢索以UTC格式存儲的數據,並將其轉換爲客戶端的時區。你能解釋一下嗎?我是否需要更改我的數據存儲方式(存儲時間戳而不是日期和時間?)謝謝。 – user418775 2012-01-01 16:43:32
@ user418775將它存儲爲時間戳會更好,但是,您可以將日期轉換爲時間戳,例如'mktime($ hour,$ minute,$ second,$ month,$ day,$ year,$ is_dst)'更多的信息在這裏:http://php.net/manual/en/function.mktime.php – 2012-01-01 16:51:13
mktime會工作 - 我只需要遍歷MySQL查詢返回的行並重新格式化數據。但是有一個併發症。如果您將UTC時間與客戶端本地時間進行比較,某些數據條目似乎在不同的日期。例如「2 2011-12-31 17:11:49」,「1 2011-12-31 18:19:35」,「2 2012-01-01 03:46:12」。 (每個字符串中的第一個數字是位置)當我將其轉換爲EST時,第一個和第三個條目都發生在12月31日。因此,它們需要分組在一起,但是由於MySQL查詢基於UTC時間,因此它們不會將它們分組在一起。 – user418775 2012-01-01 17:16:11